目录
DL的沉沉浮浮
Perceptron感知机(1958)
一种linear model, 和Logistic Regression类似,只是少了sigmoid的部分. 然后发现它有局限.
Multi-layer Perceptron多层感知机(1980s)
很多Perceptron接在一起, 和今天的DL很像.
Backpropagation反向传播(1986)
存在问题:通常超过3层的神经网络,训练不出好结果.
1 hidden layer单层全链接节点够多, 理论上可以拟合任何函数, 认为没必要多层.
Multi-layer Perceptron臭掉了, 只好改名叫Deep Learning.
GPU加速的发现(2009)
之前训练一次用一周, 一周后发现结果没有变好, 这个课题就没有人想要做了.
DL在语音识别和图像领域流行(2011)
DL三步骤
Deep learning跟machine learning一样,也是“大象放进冰箱”的三个步骤:
打开冰箱门, 把大象赶进去, 关上冰箱门.
1. 定义函式集
DL中function为Neural Network
参照上一节, 把多个对率回归前后连接在一起,其中一个对率回归称之为neuron,整个称之为neural network.
不同的方法连接neuron,得到不同的structure;
其中每一个Logistic Regression都有自己的weight和bias,其集合为network的parameter.
全连接前馈网络
连接神经元的方式需要手动设计.
最常见的连接方式叫做Fully Connect Feedforward Network(全连接前馈网络).
把神经元排成一排一排, 每排之间神经元两两互相连接.
每个神经元的w和b根据训练集找出. 将z=wx+b代入sigmoid function可算出输出y.
neuron里的sigmoid function,在Deep Learning中称为activation function(激活函数),不一定是sigmoid function(较少在Deep learning使用),可以是其他function.
已知参数的神经网络, 可以看作是一个function. 它的input是一个vector,output是另一个vector. input vector中是样本feature,vector的dimension是feature个数.
已知structure未知参数的神经网络, 可以看作是function set.
只不过用神经网络决定function set时,function set比较大,包含原来做Logistic Regression、Linear Regression所没有办法包含的function.
一般结构
共L排neuron, layer和layer之间所有的neuron两两互相连接叫做全连接, 传递方向1->2->3为前馈Feedforward.
整个neural network需要input, 即feature的vector;
对layer 1的每一个neuron来说,它的input就是input layer的每一个dimension;
layer 1的neuron output会连接给layer 2的每一个neuron作为input;
最后那个layer L,它后面没有接其它东西,它的output就是整个network的output.
input的地方,叫做input layer输入层;
output的地方,叫做output layer输出层;
其余的地方,叫做hidden layer隐藏层.
Deep Neural Network=很多hidden layers
Neural network base的方法,都称Deep Learning,层数比较多的有152个的Residual Net,它不是Fully Connected Feedforward Network,需要特殊的structure才能训练这么深的network.
矩阵运算
Network的运作过程,通常用Matrix Operation来表示.
参考: http://videolectures.net/deeplearning2015_coates_deep_learning/
以上图为例,设第一层两个neuron的weight分别是1, -2, -1, 1,排成matrix为:
$$ \begin{bmatrix}1 \ \ \ -2\\ -1 \ \ \ 1 \end{bmatrix} $$
input为2*1的vector:[1, -1]^T,将w和x相乘,再加上bias的vector,就可以得到这一层的vector z:
$$ \begin{bmatrix}1 \ \ \ -2\\ -1 \ \ \ 1 \end{bmatrix} \begin{bmatrix}1\\-1 \end{bmatrix}+\begin{bmatrix}1\\0 \end{bmatrix}=\begin{bmatrix}4\\-2 \end{bmatrix} $$
再经过activation function得到这一层的output vector:
$$ \sigma(\begin{bmatrix}4\\-2 \end{bmatrix})=\begin{bmatrix}0.98\\0.12 \end{bmatrix} $$
各层连接, a1为第一层输出与第二层输入, y为第L层输出:
注意W^i的矩阵,一行对应一个neuron的weight,行数为neuron的个数.
input x,bias b和output y都是一个列向量,行数就是feature的个数(也是neuron的个数,neuron的本质就是把feature transform到另一个space)
整个神经网络就是一连串的矩阵运算:
$$ y=f(x)=\\ \sigma(W^L\cdots \sigma(W^2\sigma(W^1x+b^1)+b^2)\cdots +b^L) $$
写成矩阵运算可以用GPU加速,GPU对矩阵运算比CPU快.
Output Layer
hidden layers部分看做feature extractor(特征提取器),代替了手动做feature engineering,feature transformation的过程,得到结构可被当作一组新的feature.
output layer看作多元分类器(拿转换后的separable feature进行分类),所以我们会在最后一个layer用softmax function而不是sigmoid function.
手写数字识别例子
Handwriting Digit Recognition
input是一张16*16的image,有256个pixel,对machine是256维的vector,image中每个pixel对应vector中一个dimension. 黑色的pixel的值设为1,白色的pixel的值设为0
神经网络output(10维, 0~9)代表一个概率分布, 每一维对应它是某个数字的几率. 该神经网络即可计算这张image为10个数字的几率各自有多少,几率最大(softmax突出极大值)的,就是机器的预测值.
决定network structure就等于决定function set的形状. 输入256维, 输出10维, 容易知道. 需要确定:
1. 中间要有几个hidden layer
2. 每个layer有几个neuron(几维).
基因演算法有一些技术可以自动找network structure. (neural architecture search)
在network structure设计中,不一定要Fully connected (全连接),可以设计不同的neuron连接. 一个特殊的接法就是CNN(Convolutional Neural Network)卷积神经网络.
传统ML与DL的选择:
传统机器学习需要特征工程, 特征提取. 用DL后这些问题变为设计network structure的问题. 这两个问题中, 哪一个比较容易, 就用哪一种方法. 比如语言/影像辨识, 不知道好的feature长什么样, 那就DL好了. 而NLP上面DL表现得没那么好, 因为人类本身比较擅长设计rule.
2.定义函式好坏
和做多元分类时一样.
辨识图像为手写的1, 目标标签y hat为第一维y hat_1=1, y hat _2~ y hat _10都为0.
接下来需要计算y hat与神经网络输出y的交叉熵(分类问题用交叉熵).
训练集有很多, 损失函数取各样本交叉熵的和:
$$ L = {\sum_{n = 1}^{N}l^{n}} $$
调整network的参数θ^*, 找尽可能小的损失.
3. 找最好的函式
找最好参数θ^*的方法: 梯度下降.
θ中是weight、bias参数,先随机找一个初始值,然后计算梯度(各参数对total loss的偏微分放在一个向量中):
$$ \nabla L = \begin{bmatrix} \frac{\partial L}{\partial w_{1}} \\ \frac{\partial L}{\partial w_{2}} \\ \vdots \\ \frac{\partial L}{\partial b_{1}} \\ \vdots \\ \end{bmatrix} $$
根据梯度更新参数,原参数-learning rate*偏微分的值:
$$ w_{1} - \mu{{\partial L}/{\partial w_{1}}} $$
这个过程反复进行下去,最终找到一组好的参数,完成DL训练.
Backpropagation是一个有效的算L对w偏微分的方法.