BP-网络可谓是机器学习领域的劝退哥,让人觉得难以亲近,其实理解之后会发现它和线性回归、逻辑回归一样,只是做了很简单的事情
那么,如何表示BP-网络才能让人更好地理解呢?
1)概念表示得是否易于理解,概念是给人看的,越容易理解越好
2)必须解释正向和反向传播在干嘛?为什么要进行反向传播?
3)应从最简单的神经网络开始,参数少,好记,不会眼花缭乱
4)公式、参数的表示和含义都要清楚,尤其是上标、下标
结合上面这几点,以解决二元分类问题为例,我们来看看BP-网络究竟做了什么
假设样本只有一个特征,一个标签,用(x,y)来表示一个样本
神经元
神经元由两个部分组成,一个是线性模型,另一个是激活函数,一般根据实际应用选择不同的激活函数
这是一个最简单的神经元:
1)有一个输入x,表示样本的一个特征(通常还有一个偏置项,我们将其忽略,因为它不影响理解)
2)设z为线性模型的输出,θ为参数
3)以sigmoid函数作为激活函数可以得到神经元的输出h(z)
没错,实际上一个神经元所做的事情和最简单的逻辑回归模型没有任何区别,但是当样本特征的数量逐渐增加时,在逻辑回归中我们常常采用将特征组合的方式构成一个多项式模型,而这将导致大量的参数需要处理,效率极低,这也是为何我们要使用神经网络的原因,就好比现在要用性能更好的多核处理器代替单核处理器了 为什么要使用神经网络?
神经网络
神经网络有三个层级,输入层、隐藏层和输出层
1)输入层的神经元读入样本特征且不做任何处理,神经元的个数取决于样本特征的数目
2)输出层表示分类的结果,对于多元分类(类别≥3),神经元的个数取决于类别的数目
3)输入层和输出层有且只有一层,而隐藏层可以有多层,每一层对上一层传递来的数据进行处理;隐藏层>1时,确保每个隐藏层的神经元个数相同;神经元的个数一般来说在不超过计算能力的情况下越多越好
这是一个三层的神经网络:
θ i j ( k ) 表示第 k 层第 i 个神经元映射到第 k + 1 层第 j 个神经元的参数 θ^{(k)}_{ij}表示第k层第i个神经元映射到第k+1层第j个神经元的参数 θij(k)表示第k层第i个神经元映射到第k+1层第j个神经元的参数
正向和反向传播
万事具备,那么,正向和反向传播究竟做了什么?
如果要类比线性回归,那么正向传播就是在计算预测值ŷ,反向传播就是用预测值ŷ减去样本值y得到损失函数,再对损失函数求导得到梯度,使用梯度下降法更新参数
a j ( i ) 表示第 i 层第 j 个神经元的输出 a^{(i)}_j表示第i层第j个神经元的输出 aj(i)表示第i层第j个神经元的输出
z j ( i ) 表示第 i 层第 j 个神经元的输入 z^{(i)}_j表示第i层第j个神经元的输入 zj(i)表示第i层第j个神经元的输入
正向传播:
第一层:
a 1 ( 1 ) = z 1 ( 1 ) = x a^{(1)}_1=z^{(1)}_1=x a1(1)=z1(1)=x
第二层:
z 1 ( 2 ) = θ 11 ( 1 ) a 1 ( 1 ) = θ 11 ( 1 ) x z^{(2)}_1=θ^{(1)}_{11}a^{(1)}_1=θ^{(1)}_{11}x z1(2)=θ11(1)a1(1)=θ11(1)x
a 1 ( 2 ) = h ( z 1 ( 2 ) ) = 1 1 + e − z 1 ( 2 ) a^{(2)}_1=h(z^{(2)}_1)=\frac {1}{1+e^{-z^{(2)}_1}} a1(2)=h(z1(2))=1+e−z1(2)1
z 2 ( 2 ) = θ 12 ( 1 ) a 1 ( 1 ) = θ 21 ( 1 ) x z^{(2)}_2=θ^{(1)}_{12}a^{(1)}_1=θ^{(1)}_{21}x z2(2)=θ12(1)a1(1)=θ21(1)x
a 2 ( 2 ) = h ( z 2 ( 2 ) ) = 1 1 + e − z 2 ( 2 ) a^{(2)}_2=h(z^{(2)}_2)=\frac {1}{1+e^{-z^{(2)}_2}} a2(2)=h(z2(2))=1+e−z2(2)1
第三层:
z 1 ( 3 ) = θ 11 ( 2 ) a 1 ( 2 ) + θ 21 ( 2 ) a 2 ( 2 ) z^{(3)}_1=θ^{(2)}_{11}a^{(2)}_1+θ^{(2)}_{21}a^{(2)}_2 z1(3)=θ11(2)a1(2)+θ21(2)a2(2)
a 1 ( 3 ) = h ( z 1 ( 3 ) ) = 1 1 + e − z 1 ( 3 ) a^{(3)}_1=h(z^{(3)}_1)=\frac {1}{1+e^{-z^{(3)}_1}} a1(3)=h(z1(3))=1+e−z1(3)1
反向传播:
δ j ( i ) 表示第 i 层第 j 个神经元的误差 δ^{(i)}_j表示第i层第j个神经元的误差 δj(i)表示第i层第j个神经元的误差
由交叉熵损失函数:
L ( a 1 ( 3 ) , y ) = − [ y l o g a 1 ( 3 ) + ( 1 − y ) l o g ( 1 − a 1 ( 3 ) ) ] L(a^{(3)}_1,y)=-[yloga^{(3)}_1+(1-y)log(1-a^{(3)}_1)] L(a1(3),y)=−[yloga1(3)+(1−y)log(1−a1(3))]
使用梯度下降法更新隐藏层与输出层间的参数,其中α为学习率
θ 11 ( 2 ) = θ 11 ( 2 ) − α ∂ L ( a 1 ( 3 ) , y ) ∂ θ 11 ( 2 ) θ^{(2)}_{11}=θ^{(2)}_{11}-α\frac {∂L(a^{(3)}_1,y)}{∂θ^{(2)}_{11}} θ11(2)=θ11(2)−α∂θ11(2)∂L(a1(3),y)
θ 21 ( 2 ) = θ 21 ( 2 ) − α ∂ L ( a 1 ( 3 ) , y ) ∂ θ 21 ( 2 ) θ^{(2)}_{21}=θ^{(2)}_{21}-α\frac {∂L(a^{(3)}_1,y)}{∂θ^{(2)}_{21}} θ21(2)=θ21(2)−α∂θ