tensorflow入门学习

参考吴恩达课程

参考链接:

一、实用层面

数据集:训练集、验证集、测试集

超参数:神经网络层数、每个隐藏层的神经元个数、学习因子、激活函数

最佳参数的获得:循环迭代:Idea\rightarrow Code\rightarrow Experiment

针对不同问题的最佳选择:样本数量、输入特征、GPU/CPU

1、数据集

(1)Train/Dev/Test

Train sets: 训练模型 

Dev sets: 验证不同算法表现情况,选择最好的算法模型

Test sets: 测试最好算法的实际表现,进行无偏估计

2、模型拟合

(1) Bias/Variance

深度学习目标:同时减小 Bias和Variance, 构建最佳神经网络模型

high bias: 欠拟合

high variance: 过拟合

图例的输入特征为二维:Train set error 体现bias, Dev set error 与 Train set error的差值体现variance 

(2) Basic Recipe for Machine Learning

high bias 的减小:增加隐藏层个数、神经元个数、训练时间延长、更复杂的NN模型

high variance的减小:增加训练样本数据、正则化Regularization

(3) Regularization

L2 refularization表达式:

J(\omega^{\lbrack1\rbrack},b^{\lbrack1\rbrack},\cdots,\omega^{\lbrack L\rbrack},b^{\lbrack L\rbrack})=\frac1m\sum_{i=1}^mL(\widehat y^{(i)},y^{(i)})+\frac\lambda{2m}\sum_{l=1}^L\left\|\omega^{\lbrack l\rbrack}\right\|^2

\left\|\omega^{\lbrack l\rbrack}\right\|^2=\sum_{i=1}^{n^{\lbrack l\rbrack}}\sum_{i=1}^{n^{\lbrack l-1\rbrack}}(\omega_{ij}^{\lbrack l\rbrack})^2

梯度下降算法:

d\omega^{\lbrack l\rbrack}=d\omega_{before}^{\lbrack l\rbrack}+{\textstyle\frac\lambda m}\omega^{\lbrack l\rbrack}

\begin{array}{l}\omega^{\lbrack l\rbrack}:=\omega^{\lbrack l\rbrack}-\alpha\cdot d\omega^{\lbrack l\rbrack}=(1-\alpha{\textstyle\frac\lambda m})\omega^{\lbrack l\rbrack}-\alpha\cdot d\omega_{before}^{\lbrack l\rbrack}\\\end{array}

选择合适大小的\lambda,能够同时避免high bias 和hige variance

(4) Dropout Regularization

Droupout: 训练中,每层的神经元按一定概率将其暂时从网络中丢弃

notice: 在测试和实际应用模型时,不需要进行dropout和随机删减神经元

(5) other regularization methods

1.增加训练样本

2.data augmentation:

  • 水平翻转、垂直翻转、任意角度旋转、缩放或扩大
  • 任意旋转或扭曲、增加noise
  • early stopping: 减少训练次数防止过拟合,但是cost function(J)不会足够小)

3、数据处理

(1) Normalizing inputs

\mu=\frac1m\sum_{i=1}^mX^{(i)}

\sigma^2=\frac1m\sum_{i=1}^m(X^{(i)})^2

X:=\frac{X-\mu}{\sigma^2}

(2) Vanishing and Exploring gradients

梯度消失和梯度爆炸:层数过多

(3) Gradient Check

  • 不要在整个训练过程中都进行梯度检查,仅作debug
  • 如果梯度检查出现错误,找到对应出错的梯度,检查其推导是否出现错误
  • 注意不要忽略正则化项,计算近似梯度的时候要包括进去
  • 梯度检查时关闭dropout,检查完毕后再打开dropout
  • 随机初始化时运行梯度检查,经过一些训练后再进行梯度检查

二、优化算法

Mini-batch gradient descent

Batch Gradient Descent: 所有m个样本,称为batch,通过向量化方法同时进行,训练速度慢

Mini-batch Gradient Descent: 把m个样本分为若干个子集,称为mini-batches

  • X^{(i)}: 第i个样本
  • Z^{(l)}: 神经网络l层的线性输出
  • X^{\left \{ t \right \}},Y^{\left \{ t \right \}}: 第t组mini-batches

算法

\begin{array}{l}for\;t=1,2,\cdots,T\{\\\;\;\;\;Forward\;Propagation\\\;\;\;\;Compute\;CostFunction\\\;\;\;\;Backward\;Propagation\\\;\;\;\;\boldsymbol\omega:=\boldsymbol\omega-\alpha\cdot d\boldsymbol\omega\\\;\;\;\;\boldsymbol b:=\boldsymbol b-\alpha\cdot d\boldsymbol b\\\}\end{array}

三、超参数调试、Batch正则化和编程框架

1、Tuning Process

(1) 超参数:

  • \alpha: 学习因子,待调范围[0.0001,1],主要分布区间[0.0001,0.1]
  • \beta: 动量梯度下降因子,待调范围[0.0001,1],主要分布区间[0.9,0.999]
  • \beta _1,\beta _2,\varepsilon: Adam算法参数,一般0.9,0.99910^{-8}
  • layers: 神经网络层数
  • hidden units: 各隐藏层神经元个数
  • learning rate decacy: 学习因子下降参数
  • mini-batch size: 批量训练样本包含的样本个数

选择和调试:随机采样\rightarrow由粗到细采样(放大表现较好区域)

(2) Using an appropriate scale to pick hyperparamenters

linear\;scale\rightarrow log\;scale

import numpy as np
a=0.0001
b=1
m=np.log10(a) #-4
n=np.log10(b) #0
r=np.random.rand()
r=m+(n-m)*r
r=np.power(10,r)


"""
m: -4.0
n: 0.0
[0,1]内随机数: 0.836032416605245
对指数区间[m,n]随机采样: -0.6558703335790201
反推到线性空间: 0.2208664070929086
"""

(3) Hyperparameters tuning in pratice: Pandas vs. Caviar

  • Babysitting one model: 受计算能力所限,只能对一个模型进行训练

调试不同的超参数,使得这个模型有最佳表现,类别Panda approach

  • Training many models in parallel: 对多个模型同时进行训练

每个模型上调试不同的超参数,根据表现情况,选择最佳的模型,类别Caviar approach

(4) Normalization activations in network

Batch Normalization: 对l层隐藏层的输入Z^{(l-1)}做标准化处理:

\mu={\textstyle\frac1m}\underset i{\sum z^{(i)}}

\sigma^2={\textstyle\frac1m}\sum_i(z_i-\mu)^2

z_{norm}^{(i)}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\varepsilon}}

m是单个mini-batch包含样本个数,\varepsilon可取10^{-8},防止分母为0

均值和方差的调整: \widetilde z^{(i)}=\gamma\cdot z_{norm}^{(i)}+\beta

tips: 

  • Normalizing inputs: 使输入均值为0,方差为1
  • Batch Normalization: 使各隐藏层输入的均值和方差为任意值
  • activation function: 隐藏层输入的均值靠近0,处于激活函数线性区域,不利于训练好的非线性神经网络

2、Batch 正则化

(1) Fitting Batch Norm into a neural network

  • Batch Norm对各隐藏层Z^{\lbrack l\rbrack}=W^{\lbrack l\rbrack}A^{\lbrack l-1\rbrack}+b^{\lbrack l\rbrack}有去均值的操作
  • b^{\lbrack l\rbrack}的数值效果可由\beta实现:可忽略隐藏层的常数项b^{\lbrack l\rbrack}
  • 梯度下降算法:分别W^{[l]},\beta^{[l]}\gamma ^{[l]}迭代更新

(2) Why does Batch Norm work?

  1. covariate shift: 训练样本和测试样本分布的变化
  2. covariate shift导致模型预测效果变差,重新训练的模型各隐藏层的W^{[l]}\beta^{[l]}均发生偏移、变化
  3. Batch Norm: 减小covariate shift的影响,让模型更加健壮、鲁棒性更强
  4. Batch Norm减少了各层W^{[l]}\beta^{[l]}之间的耦合性,让各层更加独立,实现自我训练学习

(3) Batch Norm at test time

训练过程:Batch Norm 对单个mini-batch进行操作

测试过程:仅一个样本,求均值方差无意义,需要对\mu\sigma ^{2}进行估计

  • 对l层隐藏层,考虑所有mini-batch在该隐藏层下的\mu^{[l]}\sigma ^{2[l]}
  • 指数加权平均预测当前单个样本的\mu^{[l]}\sigma ^{2[l]}
  • 利用训练过程得到的\gamma\beta,计算各层的\widetilde z^{(i)}

(4) Softmax Regression

目的:处理多分类问题

  • 用C表示种类个数,神经网络输出层有C个神经元,即\;n^{\lbrack L\rbrack}=C
  • 每个神经元的输出对应属于该类的概率
  • 输出层激活函数:z^{\lbrack L\rbrack}=W^{\lbrack L\rbrack}a^{\lbrack L-1\rbrack}+b^{\lbrack L\rbrack}a_i^{\lbrack L\rbrack}=\frac{e^{z_i^{\lbrack L\rbrack}}}{\sum_{i=1}^Ce^{z_i^{\lbrack L\rbrack}}}
  • 输出层a_i^{\lbrack L\rbrack}:对应属于该类的概率
  • 所有a_i^{\lbrack L\rbrack},即\widehat y,维度(C,1)

3、Deep learning frameworks

(1) 根据需要选择最合适的深度学习框架

  • Ease of programming(development and deployment)
  • Running speed
  • Truly open(open source with good governance)

(2) Tensorflow

cost function: J=\omega^2-10\omega+25

import numpy as np
import tensorflow as tf

w=tf.Variable(0,dtype=tf.float32)
cost=w**2-10*w+25
train=tf.train.GradientDescentOptimizer(0.01).minimize(cost)

init=tf.global_variables_initializer()
session=tf.Session()

"initialize"
session.run(init)
print(session.run(w))

"train one time"
session.run(train)
print(session.run(w))

"train"
for i in range(1000):
    session.run(train)
print(session.run(w))

"""
output:
0.0
0.099999994
4.9999886
"""

(3) Tensorflow优点

  • 数据流图(data flow graphs): 进行数值运算
  • 节点(Nodes): 表示数学操作
  • 线(edges): 表示节点间相互联系的多维数据数组,即张量(tensor)
import numpy as np
import tensorflow as tf

coefficients=np.array([[1],[-10],[25]])

w=tf.Variable(0,dtype=tf.float32)
x=tf.placeholder(tf.float32,[3,1])
cost=x[0][0]*w**2-x[1][0]*w+x[2][0]
train=tf.train.GradientDescentOptimizer(0.01).minimize(cost)

init=tf.global_variables_initializer()
session=tf.Session()

"initialize"
session.run(init)
print(session.run(w))

"train one time"
session.run(train, feed_dict={x:coefficients})
print(session.run(w))

"train"
for i in range(1000):
    session.run(train, feed_dict={x:coefficients})
print(session.run(w))

"""
output:
0.0
-0.099999994
-4.9999886
"""

猜你喜欢

转载自blog.csdn.net/qq_41747565/article/details/84659981
今日推荐