随机选择,该方法较优,原因是对于一个具体问题,不清楚哪个参数比较重要,而网格搜索是各个参数地位是平等的
归一化输入可以加快训练速度
Batch Norm是对隐藏层进行归一化操作
有两个版本的Batch Norm:
1. (Default)对节点激活函数的输入 z 进行归一化
2. 对节点的输出 a 进行归一化
Given some intermediate values in NN z(1), ... ,z(m)
如果 γ=σ2+ϵ−−−−−√,β=μ ,那么 z(i)=z~(i)
通过归一化操作,把尺度不一的输入限定在相同的量纲下,从而加快学习速度
对于一个多层的神经网络,把第二层的输出当作输入,有一个 A[2] 到 y^ 的映射,但是第二层的输出也在变化,也就是x的分布改变了,所以使用Batch Norm保证输入的均值方差,减少了输入改变的我呢体,变得更稳定,保证每层都可以独立学习,从而加速整个网络的学习。
使用mini-batch,在每个mini-batch上计算均值方差进行归一化。会给隐藏层的激活函数带来噪声,产生类似于dropout的效果。因为添加的噪声很小,只有轻微的正则化效果
和dropout一起使用获得更好的正则化效果,mini-batch size越大,正则化效果越弱,Batch Norm的正则化效果只是小的副作用,不是其主要功能。
分别对每个mini-batch进行归一化处理
测试的时候需要对样本逐个处理样本
使用指数加权平均来估计均值和方差,也可以使用其他方法
对于 σ 也是一样的操作
给定一个图像,判断是猫还是狗还是鸟还是其他,总共个有4类,C=4
第L层有4个节点,分别代表P(cat|X), P(dog|X), P(bird|X), P(other|X),和为1
L层的Activation function:
输入一个向量,输出一个同样大小的向量
和hard max相反,hard max是输出0,1,其中输入最大的是1,其他都是0
y = [0,1,0,0] y^ = [0.3,0.2,0.4,0.1]
神经网络是使损失函数最小,134项都为0,也就是使 y^j ,即猫的概率最大,理论依据:最大似然估计
在程序中输出是水平放的矩阵
梯度 dz[L]=y^−y 同样是一个(4,1)的向量
Caffe/Caffe2, CNTK, DL4J, Keras, Lasagne, mxnet, PaddlePaddle, Tensorflow, Theano, Torch
优化目标:
代码
导包
import numpy as np
import tensorflow as tf
一些设置
# 把w初始化为0,w是TensorFlow变量
w = tf.Variable(0, dtype=tf.float32)
# 定义损失函数
# cost = tf.add(tf.add(w**2, tf.multiply(-10., w)),25)
cost = w**2 - 10*w + 25 # 重载了简单的运算,比如平方乘法加减
# 定义train为学习算法,用梯度下降法是损失函数最小化
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01
惯用写法,初始化
init = tf.global_varibales_initializer()
session = tf.Session()
session.run(init) # 初始化全局变量
print(session.run()) # 让Tensorflow评估一个变量
with tf.session as session:
session.run(init)
print(session.run())
运行梯度下降法
# 运行一步梯度下降
seesion.run(train)
print(session.run(w)) # 评估一下w的值,输出它
# 运行1000次梯度下降
for i in range(1000):
session.run(train)
print(session.rumn(w))
有数据集的情况
coefficients = np.array([1.], [10.], [25.])
# 把w初始化为0,w是TensorFlow变量
w = tf.Variable(0, dtype=tf.float32)
# 训练集,这个例子中只有x,定义为(3,1)的数组
x = tf.placeholder(tf.float32, [3,1])
# 定义损失函数
cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
# 定义train为学习算法,用梯度下降法优化算法使损失函数最小化,也可以使用AdamOptimizer
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01
init = tf.global_varibales_initializer()
session = tf.Session()
session.run(init) # 初始化全局变量
print(session.run()) # 让Tensorflow评估一个变量
# 运行一步梯度下降
seesion.run(train, feed_dict={x:coefficients})
print(session.run(w)) # 评估一下w的值,输出它
# 运行1000次梯度下降
for i in range(1000):
session.run(train, feed_dict={x:coefficients})
print(session.rumn(w))
python
cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
graph LR
x00-->l1((*))
w1[w]-->w*w
w*w-->l1
x10-->l2((*))
w2[w]-->l2
l1-->l3((+))
x20-->l3
l2-->l3
l3-->cost
http://mooc.study.163.com/course/deeplearning_ai-2001281003?tid=2001391036#/info