Lecture 5. Neural Networks
这节课我们将要学习神经网络。教授本节课slides是按照单层神经网络的前向计算、损失函数、后向计算,两层神经网络的前向计算,损失函数,后向计算两个方面来讲解以及推导梯度公式。notes III是按照神经元、单层神经网络、最大间隔目标函数、元素级别的后向传播训练、向量级别的后向传播训练这些神经网络的基础来讲解。因为本章的Back Propagation是神经网络最最最重要和艰难的知识点,所以我的本次笔记会包含slides和notes的每个知识点,务必把BP研究明白!
首先,先从Notes III里讲解的神经网络的基础知识着手,然后结合课上的单层神经网络和两层神经网络的计算。
文章目录
神经网络的基础(Notes III)
在前面的课堂上我们了解了建立非线性分类器的必要性,因为现实中的大部分数据都不是线性可分的。接下来我们从几个方面来学习神经网络:
1. 神经元
神经元就是一个 n n n 个输入产生一个输出的计算单元。不同的神经元通过它们的参数(也叫做权重)生成不同的输出。sigmoid或者叫二元逻辑回归单元是一种比较流行的神经元,它能够输入 n维向量 x x x生成一个标量激活值 a a a,同时它还有一个 n维权重向量 w w w 以及偏置标量 b b b。sigmoid神经元的输出为:
a = 1 1 + e x p ( − ( w T x + b ) ) = 1 1 + e x p ( − ( [ w t b ] ⋅ [ x 1 ] ) ) a = \frac{1}{1 + exp(-(w^Tx+b))} = \frac{1}{1 + exp(-([w^t\ \ b]\cdot[x\ \ 1]))} a=1+exp(−(wTx+b))1=1+exp(−([wt b]⋅[x 1]))1
sigmoid神经元的可视化如下图:
2.神经网络的某一层
我们将神经元扩展一下,考虑这种情况:当输入向量 x x x 被送入到多个单个的神经元中,那么这就构成了神经网络中的一层。如下图所示:
假设不同神经元的权重为 { w ( 1 ) , … , w ( m ) } \{w^{(1)},…,w^{(m)}\} { w(1),…,w(m)}, 偏置为 { b 1 , … , b m } \{b_1,…,b_m\} { b1,…,bm}, 各自的激活值为 { a 1 , … , a m } \{a_1,…,a_m\} { a1,…,am},则:
a 1 = 1 1 + e x p ( w ( 1 ) T x + b 1 ) a_1 = \frac{1}{1+exp(w^{(1)T}x+b_1)} a1=1+exp(w(1)Tx+b1)1
…
a m = 1 1 + e x p ( w ( m ) T x + b m ) a_m = \frac{1}{1+ exp(w^{(m)T}x + b_m)} am=1+exp(w(m)Tx+bm)1
我们定义一些简写用来简化,同时对后续复杂的网络也很有帮助:
σ ( z ) = [ 1 1 + e x p ( z 1 ) ⋮ 1 1 + e x p ( z m ) ] \sigma(z) = \begin{bmatrix}{\frac{1}{1+exp(z_1)}}\\\vdots\\{\frac{1}{1+exp(z_m)}}\\\end{bmatrix} σ(z)=⎣⎢⎡1+exp(z1)1⋮1+exp(zm)1⎦⎥⎤
b = [ b 1 ⋮ b m ] ∈ R m b = \begin{bmatrix}b_1\\\vdots\\b_m\end{bmatrix} \in R^m b=⎣⎢⎡b1⋮bm⎦⎥⎤∈Rm
W = [ − w ( 1 ) T − … − w ( m ) T − ] ∈ R m ∗ n W = \begin{bmatrix}-\ w^{(1)T}\ -\\\dots\\-\ w^{(m)T}\ -\end{bmatrix} \in R^{m*n} W=⎣⎡− w(1)T −…− w(m)T −⎦⎤∈Rm∗n
然后,我们可以得到变换后的输出为: z = W x + b z = Wx + b z=Wx+b
则,sigmoid函数的激活值就是:
a = [ a ( 1 ) ⋮ a ( m ) ] = σ ( z ) = σ ( W x + b ) a = \begin{bmatrix}a^{(1)}\\\vdots\\a^{(m)}\end{bmatrix} = \sigma(z) = \sigma(Wx+b) a=⎣⎢⎡a(1)⋮a(m)⎦⎥⎤=σ(z)=σ(Wx+b)
这些激活值代表了什么呢?这些值可以看成是数据的特征结合权重后的表现的指标,然后我们就可以用这些激活值来完成分类任务。
3. 前向计算
到目前为止我们了解了单层sigmoid神经元输入 x ∈ R n x\in R^n x∈Rn 后是如何创建激活值 a ∈ R m a \in R^m a∈Rm的,但是这样做的直观意义是什么?我们以NLP中的实体命名识别任务为例,假设句子:
“Museums in Paris are amazing.”
我们想要对中心词“Paris”是否是命名实体进行分类。在这种情况下,我们可能不会需要掌握窗口中词的词向量的意义,而是想要根据窗口中的词的顺序来分类。例如,“Museums”作为句首的词,只有紧接着的第二个词是“in”的时候才重要。这种非线性决策边界通常不是把输入直接传递到softmax中就可以得到,而是需要通过上一小节中的中间层网络的得分才能得到。
我们定义一个矩阵 U ∈ R m ∗ 1 U \in R^{m*1} U∈Rm∗1 ,作用于激活值 a a a , 得到非规范化的得分,用来完成分类:
s = U T a = U T f ( W x + b ) s=U^Ta = U^Tf(Wx+b) s=UTa=UTf(Wx+b)
f f f 表示激活函数。
维度分析:假设我们定义词向量的维度为 4 维,输入的窗口大小为 5 ,那么输入向量 x x x 的维度为20 , x ∈ R 20 x\in{R^{20}} x∈R20。假设我们在隐藏层使用 8 个sigmoid单元,然后激活后生成一个输出得分, 则有 W ∈ R 8 ∗ 20 W\in{R^{8*20}} W∈R8∗20, b ∈ R 8 b \in {R^8} b∈R8, U ∈ R 8 ∗ 1 U \in {R^{8*1}} U∈R8∗1, s ∈ R s \in {R} s∈R。
前向传播计算的过程为:
z = W x + b z = Wx + b z=Wx+b
a = σ ( z ) a = \sigma(z) a=σ(z)
s = U T a s = U^Ta s=UTa
前向过程网络可视化如下图:
4. 最大间隔目标函数
和其他机器学习算法一样,神经网络也需要目标函数,通过最大化或者最小化目标函数度量产生的有益点或者误差。这一小节,我们来讨论一个流行的误差矩阵,叫做最大间隔目标,它的原理是保证分类正确的数据的得分,比分类错误的数据的得分高。
沿用上小节的例子,我们将正确的窗口“Museums in Paris are amazing”的得分标记为 s s s , 将错误的窗口"Not all museums is Paris"的得分标记为 s c s_c sc。那么,我们的目标函数就是最大化 ( s − s c ) (s-s_c) (s−sc) 或者最小化 ( s c − s ) (s_c - s) (sc−s)。
我们调整目标函数,保证只有当 ( s c ) > s = > ( s c − s ) > 0 (s_c) > s => (s_c - s)>0 (sc)>s=>(sc−s)>0时,才计算误差。这样调整的原因是:我们只关心比错误数据得分更高的正确数据,其他的不重要。也就是,当 s c > s s_c > s sc>s时误差为 ( s c − s ) (s_c - s) (sc−s),否则误差为0。所以,优化目标就调整为:
最小化 J = m a x ( s c − s , 0 ) J = max(s_c -s, 0) J=max(sc−s,0)
然而,上式并不能创造一个安全的间隔,从这个意义上说,这个目标函数是由风险的。我们期望正确类别数据的得分比错误类别数据的得分能高出一个间隔 Δ \Delta Δ,换句话说,我们期望当 ( s − s c < Δ ) (s-s_c < \Delta) (s−sc<Δ) 时计算误差,而不是 ( s − s c < 0 ) (s - s_c < 0) (s−sc<0)时计算。优化函数又调整为:
最小化 J = m a x ( 0 , Δ + s c − s ) J = max(0, \Delta + s_c - s) J=max(0,Δ+sc−s)
我们通过设置 Δ = 1 \Delta = 1 Δ=1来规范化间隔。
如果想要了解更多关于最大间隔的信息,可以查阅SVM算法中经常会出现的功能和几何间隔。
最终,我们定义所有训练窗口的优化函数为:
最小化