深度学习 —— 深度前馈网络

青春壹個敷衍的年華 提交于 2019-12-28 05:03:20

6.1 XOR例子

在这里插入图片描述
对于如图所示的异或问题,简单的单层线性函数f(x,w,b)=xTw+bf(x,w,b)=x^Tw+b无法解决异或问题;

解决办法是增加深度,即加入隐层单元h;h=f(1)(x,W,c),y=f(2)(h,w,b)h=f^{(1)}(x,W,c),y=f^{(2)}(h,w,b),完整版的模型是f(x,W,c,w,b)=f(2)(f(1)(x))f(x,W,c,w,b)=f^{(2)}(f^{(1)}(x))

f(1)f^{(1)}应该是哪种函数?线性模型到目前为止都表现不错,让f(1)f^{(1)}也是线性的似乎很有诱惑力。可惜的是,如果f(1)f^{(1)}是线性的。那么前馈网络作为一个整体对于输入仍然是线性的。暂时忽略截距项,假设f(1)(x)=WTxf^{(1)}(x)=W^Tx并且f(2)(h)=hTwf^{(2)}(h)=h^Tw,那么f(x)=wTWTxf(x)=w^TW^Tx。我们可以将这个函数重新表示成f(x)=xTwf(x)=x^Tw',其中w=Www'=Ww

为了解决这个问题,可以使用非线性激活函数relu,g(z)=max0,zg(z)=max{0,z}

f(x,W,c,w,b)=wTmax{0,WTx+c}+bf(x,W,c,w,b)=w^Tmax\left \{0,W^Tx+c \right \}+b
在这里插入图片描述
现在可以给出一个XOR问题的一个解。令W=[1111]W=\begin{bmatrix} 1&1 \\ 1&1 \end{bmatrix}c=[01]c=\begin{bmatrix} 0\\ -1 \end{bmatrix}w=[12]w=\begin{bmatrix} 1\\ -2 \end{bmatrix}b=0b=0这个解可以成功解决XOR问题。

6.2 神经网络结构

6.3 神经网络表达力与过拟合

  • 理论上说单隐层神经网络可以逼近任何连续函数(只要隐层的神经元个数足够多);
  • 虽然从数学上看表达能力一致,但是多隐层的神经网络比单隐藏层的神经网络工程效果要好得多;
  • 对于一些分类数据(比如CTR预估里),3层神经网络效果优于2层神经网络,但是如果把层数再不断增加(4,5,6层),对最后结果的帮助就没有那么大的跳变了;
  • 图像数据比较特殊,是一种深层(多层次)的结构化数据,深层次的卷积神经网络,能够更充分和准确地把这些层级信息表达出来;
  • 提升隐层层数或者隐层神经元个数,神经网络“容量”会变大,空间表达能力会变强;
  • 过多的隐层和神经元节点,会带来过拟合问题,不要试图通过降低神经网络参数数量来减缓过拟合,用正则化或者dropout;

6.4 传递函数(激活函数)

为什么通常Relu比sigmoid和tanh强,有什么不同?

  • 主要是因为它们梯度特性不同,sigmoid和tanh的梯度在饱和区域非常平缓,接近于0,很容易造成梯度消失的问题,减缓收敛速度。梯度消失在层数多的时候尤其明显,是加深网络结构的主要障碍之一。
  • Relu的梯度大多数情况下是常数,有助于解决深层网络的收敛问题。Relu的另一个优势是在生物上的合理性,它是单边的,相比于sigmoid和tanh,更符合生物神经元的特征。
  • 提出的sigmoid和tanh,主要是因为它们全程可导。还有表达区间问题,sigmoid和tanh区间是0到1,或者-1到1,在表达上,尤其是输出层的表达上有优势。
  • Relu更容易学习优化,因为其分段线性性质,导致其前传,后传,求导部分都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息。

6.5 损失函数(代价函数)

两类问题

  • 回归问题(均方误差MSE)
    J=12Ni=1Nyiy^i2J=\frac{1}{2N}\sum_{i=1}^N||y^i-\hat{y}^i||^2将损失函数对yiy^i进行求导可以得到:Jyi=12Ni=1N(yiy^i)2\frac{\partial J}{\partial y^i}=\frac{1}{2N}\sum_{i=1}^N(y^i-\hat{y}^i)*2=1Ni=1N(yiy^i)=\frac{1}{N}\sum_{i=1}^N(y^{i}-\hat{y}^i)
  • 分类问题(交叉熵)
    分类问题相较于回归问题会多一层网络,这就是softmax层,softmax变换公式为:Sk=eyki=1neyiS_k=\frac{e^{y_k}}{\sum_{i=1}^ne^{y_i}}通过softmax变换使得输出变为一个概率分布,概率之和为1。同样,数据本来的标签之和也为1。怎样衡量这两个概率分布之间的距离呢?我们通过KL距离(相对熵)来衡量两个向量之间的关系。

KL距离(相对熵)
KL距离,是Kullback-Leibler差异的简称,也叫相对熵。它衡量的是相同事件空间里的两个概率分布的差异情况。其物理意义是:在相同事件空间里,概率分布P(x)P(x)对应的每个事件,若用概率分布Q(x)Q(x)编码时,平均每个基本事件(符号)编码长度增加了多少比特。我们用D(PQ)D(P||Q)表示KL距离,计算公式如下:D(PQ)=P(x)logP(x)Q(x)D(P||Q)=\sum P(x)log\frac{P(x)}{Q(x)}若两个概率分布完全相同时,即P(x)=Q(x)P(x)=Q(x),其相对熵为0。

对于分类问题,一个样本对应的网络的输出S(s1,s2,..,sn)S(s_1,s_2,..,s_n)是一个概率分布,而这个样本的标注S^\hat{S}一般为(0,0,...,1,0,0,...,0)(0,0,...,1,0,0,...,0),也可以看做一个概率分布(硬分布)。

cross entropy可以看做是s^\hat{s}ss之间的KL距离。D(s^s)=s^logs^sD(\hat{s}||s)=\sum\hat{s}log\frac{\hat{s}}{s}假设S^=(0,0,...,1,0,...,0)\hat{S}=(0,0,...,1,0,...,0),其中1为s^\hat{s}的第kk个元素(索引从0开始),令S=(s0,s1,...,sk,...,sn1)S=(s_0,s_1,...,s_k,...,s_{n-1}),则D(s^s)=1log1sk=logsk(CE)D(\hat{s}||s)=1log\frac{1}{s_k}=-logs_k(CE损失函数)J=logsk()J=-logs_k(可看做目标类别概率最大)==logeyki=0n1eyi==-log\frac{e^{y_k}}{\sum_{i=0}^{n-1}e^{y_i}}Jym=ym(logi=0n1eyiyk)=eymi=0n1eyiδ(m=k)=smδ(m=k)\frac{\partial J}{\partial y_m}=\frac{\partial}{\partial y_m}(log \sum_{i=0}^{n-1}e^{y_i}-y_k)=\frac{e^{y_m}}{\sum_{i=0}^{n-1}e^{y_i}}-\delta(m=k)=s_m-\delta(m=k)公式中的δ(m=k)\delta(m=k)表示当m=km=k时,δ\delta的值为1。写成向量形式Jy=SS^\frac{\partial J}{\partial y}=S-\hat{S}S=(s0,s1,...,sk,...,sn1)S=(s_0,s_1,...,s_k,...,s_{n-1})S^=(0,0,...,1,0,...,0)\hat{S}=(0,0,...,1,0,...,0)

6.6 梯度下降(批量梯度下降、随机梯度下降、小批量梯度下降)

批量梯度下降

优点:

  • 一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行;
  • 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优;

缺点:

  • 当样本数目m很大时,每迭代一步都需要对所有样本计算,训练过程会很慢;
  • 从迭代的次数上来看,BGD迭代的次数相对很少,其迭代的收敛曲线示意图可以表示如下:

在这里插入图片描述

随机梯度下降

优点:

  • 由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快;

缺点

  • 准确度下降,由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛;
  • 可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势;
  • 不易于并行实现;

小批量梯度下降

优点:

  • 通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多;
  • 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果;
  • 可实现并行化;

缺点:

  • batch_size的不当选择可能会带来一些问题;

batch_size的选择带来的影响:

  • 在合理范围内,增大batch_size的好处:
    • 内存利用率提高了,大矩阵乘法的并行化效率提高;
    • 跑完一次epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快;
    • 在一定范围内,一般来说batch_size越大,其确定的下降方向越准,引起训练震荡越小;
  • 盲目增大batch_size的坏处:
    • 内存利用率提高了,但是内存容量可能撑不住了;
    • 跑完一次epochs(全数据集)所需的迭代次数减少,想要达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢;
    • batch_size增大到一定程度,其确定的下降方向已经基本不再变化;

6.7 前向传播

6.8 反向传播

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!