Java教程

李宏毅ML笔记5: 深度学习简介

本文主要是介绍李宏毅ML笔记5: 深度学习简介,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

DL的沉沉浮浮

DL三步骤

1. 定义函式集

全连接前馈网络

矩阵运算

Output Layer

手写数字识别例子

2.定义函式好坏

3. 找最好的函式


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偏微分的方法.

 

这篇关于李宏毅ML笔记5: 深度学习简介的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!