Neural Network

神经网络是由一系列的计算单元组成的网络结构,每一个计算单元接受一个输入,然后对应地产生一个输出。最简单的神经网络就是前馈神经网络了。

与逻辑回归对比

一个只有一个隐层的神经网络跟逻辑回归特别类似,区别在于:1)神经网络更强大,一个只有一个隐层的神经网络,理论上可以学习任何函数;2)逻辑回归中我们需要手动挑选特征,或者开发出一些特征模板(feature template)作为模型的输入,而神经网络一般用raw data作为输入,如单词的词向量。

计算单元

一个计算单元的工作基本上是固定的,用weights参数对给定的input进行加权,然后加上bias,得到z,然后对z施加一个激活函数(非线性函数),得到输出。
$$
z = w \cdot x + b \\
a = f(z)
$$
计算单元

激活函数

激活函数是根据weighted sum of input来决定是否激活当前unit。如何理解“激活”一词呢?假设我们输出只有两个数,一个是0,一个是1,那么当我们输出为1的时候,我们称这个计算单元被激活了;当输出为0的时候,当前激活单元没有被激活。当然,也可以部分激活。以sigmoid激活函数为例,输出介于0~1之间。

常见的激活函数

step function, linear function, sigmoid, tanh, Relu, leaky Relu,

NOTE: Relu在零点的值,在零点的导数值

激活函数优缺点对比

perceptron

不含激活函数的感知机,因为缺乏非线性运算,所以只能模拟出线性可分的函数,不能模拟线性不可分的函数,如XOR(exclusive or,只有输入为[1,0]和[0,1]时才输出1)。多层的感知机

前馈神经网络

前馈神经网络,也叫全连接神经网络,主要由输入层,隐层和输出层组成。习惯上我们将第一个隐层称为第一层,输出层称为最后一层。因此:
$$
\begin{align}
z^{[1]} &= W^{[1]}a^{[0]} + b^{[1]} \\
a^{[1]} &= g(z^{[1]}) \\
z^{[2]} &= W^{[2]}a^{[1]} + b^{[2]} \\
a^{[2]} &= g(z^{[2]}) \\
\hat y &= a^{[2]}
\end{align}
$$
$a^{[0]}$表示输入层。

前馈神经网络用于分类的时候,loss function用的也是交叉熵。在使用梯度下降法进行优化的时候,梯度通过backpropagation进行,计算的过程可以在计算图上表示出来。反向传播的核心思想是导数的链式法则,$f(x) = u(v(x))$对于x的导数,可以拆分为$u(x)$对于$v(x)$的导数,乘以$v(x)$对于x的导数。以此类推,当存在n个chain的时候,也以相同的方式进行求导。

总结一下,gradient descent的流程为:先feedforward,求出计算图(computation graph)中每一个计算节点的值,然后backpropagation,求每一个计算节点相对于上一个计算节点的梯度(是数值);最后,最终的loss对于每一个参数的梯度,可以通过链式法则求解。

一个简单的前馈神经网络的计算图

优化tips

参数初始化:逻辑回归的参数初始化可以全设置为0,但对于神经网络,一般设置为较小的随机数;

归一化(normalization):将input归一化为均值为0,方差为1;

避免过拟合的方法:正则化;dropout;

tune超参数:在devset上调超参;

GD的变体:梯度下降有很多变体,采用合适的梯度下降方法,可以加速收敛

The power of neural networks comes from the ability of early layers to learn
representations that can be utilized by later layers in the network.

摘自slp3中第7章的summary