神经网络

【第一周笔记】神经网络和深度学习

2019-01-19  本文已影响102人  慎独墨写

第一节 概论

一、什么是神经网络

由人脑的工作模式启发衍生的强力学习算法

例 1 – 单神经网络

给出有关房地产市场房屋大小的数据,拟合一个函数来预测其他房地产数据的价格。这是一个线性回归问题,因为作为大小函数的价格是连续输出。由于价格不可以为负数,因此我们建立了一个修正线性单元(ReLU),该函数从零开始。

基于单变量的房价预测

输入是房子面积x,输出是房价y

“神经”构造了该ReLU函数。

The input is the size of the house (x) The output is the price (y) The “neuron” implements the function ReLU (blue line)

例 2 – 多神经网络

房价由多种情况影响,如大小、卧室数量、邮编、街区富裕情况......神经网络在预测的时候会产生隐藏单元,我们并不会指定每个隐藏单元代表什么意思,只需要给出相应的输入x和输出y就好了。

基于多变量的房价预测

二、监督学习

1.监督学习基本分为两大问题:
输入和输出都是有参照的,根据参照,给定一个新的输入,预测新的输出。如房价:给定某地房子大小和房价的数据,根据这些数据,给定一个房子尺寸大小,预测该尺寸对应的房价。

分类:

2.常用的神经网络

image : CNN

sequence data (audio,language...) RNN or complex RNNS

Structured data : 每个特征有清晰的定义

Unstructured data : Audio Image text

第二节 神经网络基础

一、logistic 回归

1.二分分类问题

二分分类问题的目标是训练出一个分类器以图片的特征向量x作为输入,预测输出的结果标签y是1还是0。

其中X 是每个特征向量集合成的大矩阵,X\in \mathbb{R}^{n_{x\times m}}

Y = [ y^{(1)},y^{(2)},\dots,y^{(m)} ] 因此 Y\in \mathbb{R}^{1\times (m)}

2.Logistic Regression

给出 X ,想要预估的 \hat y = P(y=1|x)

参数 : w\in \mathbb{R}^{n_{x}},\ b\in \mathbb{R}

输出 : \hat y = \sigma(w^{\top}x+b)

其中sigmoid函数表示为:\sigma(z)=\frac{1}{1+e^{-z}}

sigmoid函数

在实际编程中会把w和b分开,b对应一个拦截器。

3.logistic regression cost function

所以在给定数据集\{ (x^{(1)},y^{(1)}),\dots,(x^{(m)},y^{(m)}) \},我们想要让对每个x^{(i)}的预测值{\hat y}^{(i)} \approx {y}^{(i)}

\mathcal{L}(\hat y,y)= - (y \log {\hat y} + (1-y) \log (1-\hat y))

if y=1: \mathcal{L}(\hat y,y) = - \log \hat y 想要损失函数小,我们需要\hat y

if y=0: \mathcal{L}(\hat y,y) = - \log (1- \hat y) 想要损失函数小,我们需要\hat y

loss function :基于单个训练样本

cost function:基于参数的总样本

cost function:

J(w,b) = \frac{1}{m}\sum_{i=1}^m \mathcal L(\hat y^{(i)},y^{(i)}) = - \frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log {\hat y^{(i)}} + (1-y^{(i)}) \log (1-\hat y^{(i)})

最终目的是使代价函数J(w,b)尽可能小
4.梯度下降

J(w,b) = \frac{1}{m}\sum_{i=1}^m \mathcal L(\hat y^{(i)},y^{(i)}) = - \frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log {\hat y^{(i)}} + (1-y^{(i)}) \log (1-\hat y^{(i)})

为了将J减小,我们必须找到合适的w和b。

梯度下降算法中,重复{

w := w - \alpha \frac{\partial J(w,b)}{\partial w}

b := b - \alpha \frac{\partial J(w,b)}{\partial b}

}

α被称作 学习率,决定了迭代步长

对m个样本梯度下降

算法:

J=0;\mathbf{d}w1=0;\mathbf{d}w2=0;\mathbf{d}b=0;

For i = 1 to m

z^{(i)} = w^{\top}x^{(i)}+b

a^{(i)} = \sigma(z^{(i)})

J+= -y^{(i)} \log {\hat y^{(i)}} + (1-y^{(i)}) \log (1-\hat y^{(i)})

\mathbf{d} z^{(i)} = a^{(i)}-y^{(i)}

\mathbf{d}w_{1} += x_{1}^{(i)}\mathbf{d}z^{(i)}

\mathbf{d}w_{2} += x_{2}^{(i)}\mathbf{d}z^{(i)}

\mathbf{d}b+=\mathbf{d} z^{(i)}

J /=m

\mathbf{d}w_{1}/=m

\mathbf{d}w_{2}/=m //如果多余2个特征值 w值延续到nx

\mathbf{d}b/=m

//在这时 \mathbf{d}w_{1} = \frac{\partial J}{w_{1}} 以此类推 其他的d值也都成为了J对该值的偏导数

w_{1} = w_{1} - \alpha \mathbf{d}w_{1}

w_{2} = w_{2} - \alpha \mathbf{d}w_{2}

b = b - \alpha \mathbf{d}b

该算法中会出现两次显性的for循环,这是非常低效的,为了解决这样的问题,使用向量化的方法。

二、向量化

GPU和CPU都有SIMD指令,即允许单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。GPU更擅长SIMD指令操作。

在实际编程中尽可能地避免显性for循环。

在python编程中善用np.dot()函数

e.g.将v= \begin{bmatrix} v_{1} \\ \vdots\\ v_{n} \end{bmatrix}转变为u= \begin{bmatrix} e^{v_{1}} \\ \vdots\\ e^{v_{n}} \end{bmatrix}

u = np.zeros((n,1))
for i in range(n):
    u[i] = math.exp(v[i])
import numpy as np
u = np.exp(v)
np.log(v)
np.abs(v)
np.maximum(v,0)
v**2
1/v

对logistic regression算法进行向量化
​定义一个大矩阵X = [x^{(1)},x^{(2)},\dots,x^{(m)}]

算法:

J=0;\mathbf{d}w1=0;\mathbf{d}w2=0;\mathbf{d}b=0;
Z=w^{\top}X+b
​ = np.dot(w.T,X)+b
A = \sigma(Z)
\mathbf{d} z = A-Y
\mathbf{d}w = \frac {1}{m}X\mathbf{d}z^{\top}
\mathbf{d}b = \frac {1}{m} np.sum(\mathbf{d}z)
w = w- \alpha \mathbf{d}w //反向更新w
b = b - \alpha \mathbf{d}b //反向更新b

关于正向传播和反向传播的理解,参考https://www.cnblogs.com/charlotte77/p/5629865.html,该作者用数字化的演示详细地阐述了back propagation的重要意义。直观地将,逐步更新权值项w和截距项b的过程就是BP的主要过程。

第三节 浅层神经网络

一、神经网络

神经网络表示

双层神经网络,一般不把输入层算入标准层,输入层也被称作第零层。隐藏层和最后的输出层是带有参数的,隐藏层带有两个相关的参数W和b。在本图中,​是一个4×3的矩阵。4来源于四个隐藏层,3来自于三个输入层。​是一个4×1的矩阵。​是一个1×4的矩阵,因为隐藏层有四个隐藏单元,只有1个对应的输出,​是一个1×1的矩阵。

二、激活函数

tanh(z) = \frac{e^z-e^{-z}}{e^z+e^{-z}}
tanh函数的平均值接近0,因此有数据中心化的效果。在效果上比sigmoid函数要好。
另外,tanh(z)求导的结果是tanh'(z) = 1 - (tanh(z))^2

在做二元分类的时候可以使用sigmoid函数,因为需要输出结果在0到1之间。
ReLU函数

a=\max(0,z)

带泄露的ReLU:

a = \max(0.01z,z)

如果所有隐藏单元都使用线性激活函数的话,那么在逻辑上是没有意义的。

三、梯度下降

对于神经网络的梯度下降


神经网络的梯度下降

权重的随机初始化也非常重要,如果在一开始的时候全都赋值为0的话,很有可能会造成所有隐藏神经元都在进行同一个函数的计算,这样的话该神经网络会发生“对称”。

第四节 深层神经网络

一、前向传播

A^{[0]}=X

z^{[l]}=w^{[l]}A^{[l-1]}+b^{[l]}

A^{[l]}=g^{[l]}(Z^{[l]})

深层神经前向传播的过程大致如此,l从1一直迭代到最深层。在这一步可能需要一个显性的for循环。

总结起来w^{[l]}的维度必须是(n^{[l]},n^{[l-1]}),b^{[l]}的维度是(n^{[l]},1)

二、参数和超参数

参数:w^{[1]},b^{[1]}\dots

超参数:某种程度上决定了最终的W和b

······

上一篇下一篇

猜你喜欢

热点阅读