神经网络
小收获:神经重接实验。把耳朵到听觉皮层的神经切断,在这种情况下,将其重新接到一个动物的大脑上,这样从眼睛到视神经的信号最终将传到听觉皮层,如果这样做了,那么结果表明,听觉皮层将会学会“看”,这里“看”代表了,我们所知道的每层含义。所以,如果你对动物这样做,那么动物就可以完成视觉辨别任务,它们可以看图像,并根据图像做出适当的决定,它们正是通过脑组织中的这个部分完成的。也就是说,大脑皮层的虽然划分了信息处理的区域,不同区域的皮层处理不同信息,但实际上每个部分都能够通过自身学习来对其他信息进行处理。
在一些现实问题(比如图像识别)中,特征数量可能有上亿个,而组成预测模型的多项式更是在特征数量的基础上成几何倍数增长。
1 人工神经元
大脑中的神经元由多个树突和一个轴突组成,树突输入其他神经元传递过来的信息,在该神经元进行处理后,将处理结果由轴突输出给另一个神经元。机器学习中的神经元以此为模板,一个人工神经元将多个输入信息进行处理,经过一个或多个中间层,最终产出一个信息输出给另一个神经元。
举例:

每一层的\(x_0\)固定取值1,不是由前面的信息处理得到的,\(x_0\)称为偏置节点。
第一层(输入层)将数据传入第二层,经过1-2层和2-3层的处理后最终输出预测函数。输入层和输出层中间可能不止一层,这些中间层也称为“隐蔽层”。
在神经网络中,我们称\(\theta \)为权重。
第二层的节点称为激活节点(activation units),通过逻辑激活函数(Logistic activation function,就是分类问题中的逻辑函数)对第一层的数据进行处理从而得到第二层节点的数据a,a称为激活节点上的激励值。

\(\Theta ^j\)矩阵是从第\(j\)层到第\(j+1\)层的权重矩阵。
例如:


也即$$\begin{align*}a_1^{(2)} = g(z_1^{(2)}) \newline a_2^{(2)} = g(z_2^{(2)}) \newline a_3^{(2)} = g(z_3^{(2)}) \newline \end{align*}$$
$$z_k^{(2)} = \Theta_{k,0}^{(1)}x_0 + \Theta_{k,1}^{(1)}x_1 + \cdots + \Theta_{k,n}^{(1)}x_n$$
注意从\(j\)层到\(j+1\)层,输入有偏置节点,输出无。如果网络在第\(j\)层中有\(s_j\)个单位,在第\(j + 1\)层中有\(s_{j + 1}\)个单位,则\(\Theta _j\)的维数为\(s_{j+1}\times (s_j + 1)\)。
$$h_\Theta(x) = a^{(j+1)} = g(z^{(j+1)})$$
请注意,在最后一步中,在第\(j\)层和第\(j + 1\)层之间,我们所做的事情与在逻辑回归中所做的完全相同。在神经网络中添加所有这些中间层,使我们可以更优雅地产生有趣且更复杂的非线性假设。
2 应用举例1
用三层神经网络实现同或逻辑计算(XNOR),即\(x_1\)和\(x_2\)相同则计算结果为1,不同则计算结果为0,这里\(x_1\)和\(x_2\)在\(\left \{ 0,1\right \}\)中取值。
当\(x_1\)和\(x_2\)都为0或者都为1的时候XNOR计算输出1,这里共包含了三个逻辑计算,AND,NOR,OR。AND和NOR组成了第二层神经网络,OR组成了第三层神经网络。
首先写出这三种基础逻辑计算神经元的权重,
$$\begin{align*}AND:\newline\Theta^{(1)} &=\begin{bmatrix}-30 & 20 & 20\end{bmatrix} \newline NOR:\newline\Theta^{(1)} &= \begin{bmatrix}10 & -20 & -20\end{bmatrix} \newline OR:\newline\Theta^{(1)} &= \begin{bmatrix}-10 & 20 & 20\end{bmatrix} \newline\end{align*}$$
神经网络的组成结构为:
$$\begin{align*}\begin{bmatrix}x_0 \newline x_1 \newline x_2\end{bmatrix} \rightarrow\begin{bmatrix}a_1^{(2)} \newline a_2^{(2)} \end{bmatrix} \rightarrow\begin{bmatrix}a^{(3)}\end{bmatrix} \rightarrow h_\Theta(x)\end{align*}$$
第一层权重矩阵\(\Theta ^{(1}\)为:
$$\Theta^{(1)} =\begin{bmatrix}-30 & 20 & 20 \newline 10 & -20 & -20\end{bmatrix}$$
第二层权重矩阵\(\Theta ^{(2}\)为:
$$\Theta^{(2)} =\begin{bmatrix}-10 & 20 & 20\end{bmatrix}$$
第二层激励值、第三层激励值和预测结果为:
$$\begin{align*}& a^{(2)} = g(\Theta^{(1)} \cdot x) \newline& a^{(3)} = g(\Theta^{(2)} \cdot a^{(2)}) \newline& h_\Theta(x) = a^{(3)}\end{align*}$$

4 反向传播(Backpropagation Algorithm)
首先规定:
- L = total number of layers in the network
- s_lsl = number of units (not counting bias unit) in layer l
- K = number of output units/classes
- \((h_\Theta (x^{(i)}))_k)\)表示第k个output的假设函数
神经网络的代价函数(Cost Function)在逻辑回归代价函数的基础上变化:
$$\begin{gather*} J(\Theta) = – \frac{1}{m} \sum_{i=1}^m \sum_{k=1}^K \left[y^{(i)}_k \log ((h_\Theta (x^{(i)}))_k) + (1 – y^{(i)}_k)\log (1 – (h_\Theta(x^{(i)}))_k)\right] + \frac{\lambda}{2m}\sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} ( \Theta_{j,i}^{(l)})^2\end{gather*}$$ |
第一部分中遍历所有输出节点的求和;正则化部分中包含多个\(\theta\)矩阵(仍是将每一项平方)。
反向传播的目的是将代价函数最小化,其本质是梯度下降法,在前向传播完成后,对误差进行反向传播,更新权值。
https://www.cnblogs.com/charlotte77/p/5629865.html
5 梯度检查
使用梯度检查法来检查反向传播算法的代码是否有误,注意,梯度检查法只适用于检验,因为它的效率太低,在开始求最优参数时务必将梯度检查法的代码关掉。

\(\epsilon\)取一个小值如\(\epsilon=10^{-4}\),但也不能过小。
epsilon = 1e-4;
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) += epsilon;
thetaMinus = theta;
thetaMinus(i) -= epsilon;
gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;
gradApprox ≈ deltaVector,则反向传播算法代码正确。
6 随机初始化
将所有\(theta\)权重初始化为零不适用于神经网络。当我们反向传播时,所有节点将重复更新为相同的值。相反,我们可以使用以下方法为\(\Theta\)矩阵随机初始化权重:

%If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.
Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;

7 小结
首先,确定要构造的神经网络的结构:
- 输入层单元数 = 特征维数
- 输出层单元数 = 分类类别数
- 隐含层单元数通常越多越好,但是过多的单元数会导致代价过大
- 默认1个隐含层,如果隐含层有多个,推荐每个隐含层的单元数相等
Training a Neural Network
- Randomly initialize the weights
- Implement forward propagation to get h_\Theta(x^{(i)})hΘ(x(i)) for any x^{(i)}x(i)
- Implement the cost function
- Implement backpropagation to compute partial derivatives
- Use gradient checking to confirm that your backpropagation works. Then disable gradient checking.
- Use gradient descent or a built-in optimization function to minimize the cost function with the weights in theta.
for i = 1:m,
Perform forward propagation and backpropagation using example (x(i),y(i))
(Get activations a(l) and delta terms d(l) for l = 2,...,L