这篇记录的内容来自于Andrew Ng教授在coursera网站上的授课。
1.为什么使用神经网络:样本的特征数太多了,使用前面的算法都几乎不可能达到一个理想的结果。
2.神经网络(neural networks):
受到脑神经的启发,我们有以下结构:
术语:
输入层(input layer):输入样本的特征。
输出层(output layer):输出预测。
隐藏层(hidden layer):因为“看不到”,所以叫隐藏层。(除非debug)
激活单元(activation units):即图中的$a_1^{(2)},a_2^{(2)}$,通过前面一层的输出作为输入,经过激活函数来计算输出值。表示方法为$a_i^{j}$,含义为第j层(输入层是第一层)的第i个激活单元。
激活函数:这里用sigmoid函数。所以每一个输出的值都在(0,1)中。
z代表这层的输入,a代表这层的输出。
权重(weights):层与层之间的映射。记为$\Theta^{(j)}$,含义为第j层到第j+1层的权重。$\Theta^{(j)}_{x,y}$表示第j层的第y个(不要搞反了)激活单元与第j+1层的第x个激活单元的权重。权重矩阵的大小是$s_{j+1}*(s_j+1)$的。+1是应为多了一个偏置(bias)项,老传统了。
前向传播(forward propagation):根据输入,计算输出的方法。对于第j层的输出,有:$$a^{j}=g(\Theta^{j-1}*a^{j-1})$$,其中g是sigmoid函数。
我们的假设h函数就等于它,它也是个向量而不止是一个数字了。
1.记号:
L:总层数。
$s_i$:第i层的节点数(不包括偏置项)。
K:分类数。
那么,整个网络的代价即为:
$$J(\Theta)=-\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K}(y_k^{(i)}log((h_{\theta}(x^{(i)}))_k)+(1-y_k^{i})log(1-(h_{\theta}(x^{(i)}))_k))+\frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(\Theta_{j,i})^2$$
2.反向传播(backforward propagation):神经网络的梯度下降。
$\delta_{j}^{(l)}$:第l层第j个激活单元的误差(bias从0开始)。对于输出层我们有:
$$\delta^{(l)}=\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}{(x^{(i)})}-y^{(i)})=\frac{1}{m}\sum_{i=1}^{m}(g(x^{(i)})-y^{(i)})$$
接着,
$$\delta^{(l-1)}=(\Theta^{(l-1)})^T\delta^{(l)}.*g'(z^{(l-1)})$$其中$z^{(l)}$指的是第l层在前向传播时获得的输入,.*是点乘。
注意到,
$$g'(z^{(l)})=a^{(l)}.*(1-a^{(l)})$$
并且,
$$\frac{\partial}{\partial\Theta^{(l)}_{i,j}}J(\Theta)=a^{(l)}_j\delta_i^{(l+1)}$$
具体推导此处省略。你可以观看3B1B的相关视频,来进行感性的理解。
神经网络的实现还是有点麻烦的。