deep learning
一些基本概念 及模型的介绍,
有关图片识别的部分被指定为像素的float表示,label的int表示。
在有关模型的讨论中数据集被分割为三部分:train_set valid_set test_set
分别以numpy的数组方式进行储存
valid_set用于选择超参数
基本的实现先说明分类模型,对于分类方法,所指定的是概率上的最大值问题,
条件概率,条件概率中的超参数由valid_set中的数据进行决定。
最简单的classify方法是使用0-1损失函数,使用条件概率函数的最大值作为估计
进行构造。
相应的theano:
zero_one_loss = T.sum(T.neq(T.argmax(p_y_give_x), y))
默认的T.argmax实现flattened 方向的最大下标求解,即横向,axis参数的使用
方法与numpy相同。
T.neq (not equal)
另外一种损失是负的对数似然函数,原因是明显的,数理统计。
相应的theano:
NLL = -T.sum(T.log(p_y_given_x)[T.arange(y.shape[0]), y])
在优化问题中比如随机梯度这种求解参数的方法有更新迭代的方式,
一般是使用的步长被称为学习率(learning rate)。
不同的梯度算法体现在损失函数的不同,一般梯度下降使用所有样本定义
损失函数,随机梯度下降使用单个样本定义损失函数,minibatch梯度下降
使用某些样本定义损失函数。
利用一般的梯度下降算法的过程可以概括为如下伪代码。(是对所有样本的使用)
while True:
loss = f(params)
d_loss_wrt_params = ... # compute gradient
params -= learning_rate * d_loss_wrt_params
if <stopping condition is met>:
return params
随机梯度下降是将while这个无穷的循环转换为对单个样本的使用,下面是伪代码:
for (x_i, y_i) in training_set:
loss = f(params, x_i, y_i)
d_loss_wrt_params = ...# compute gradiemt
params -= learning_rate * d_loss_wrt_params
if <stopping condition is met>:
return params
minibatch梯度下降:
for (x_batch, y_batch) in train_batches:
loss = f(params, x_batch, y_batch)
d_loss_wrt_params = ...# compute gradient
params -= learning_rate * d_loss_wrt_params
if <stopping condition is met>:
return params
在Theano中实现上述算法(伪代码)的过程可以概括为:
d_loss_wrt_params = T.grad(loss, params)
updates = [(params, params - learning_rate * d_loss_wrt_params)]
MSGD = theano.function([x_batch, y_batch], loss, updates = updates)
for (x_batch, y_batch) in train_batches:
print 'Current loss is ', MSGD(x_batch, y_batch)
if stopping_condition_is_met:
return params
有关正则化的讨论在对于Ridge Regression 及Lasso Regression的相关内容
中已经进行了比较完备的讨论,其形式也是比较简单的,如下:
L1 = T.sum(T.abs(params))
L2 = T.sum(params ** 2)
loss = NLL + lambda_1 *L1 + lambda_2 * L2
下面是在优化问题中也会讨论到的一个方面,即求解算法的停止问题。
决定算法停止一般是通过valid_set的相关训练得到(此部分数据与train_set test_set
相独立),当所进行的优化表现在valid_set表现地足够好(对于这种情况,本质上可以看
做泛函分析中迭代不动点的收敛问题,故得到最优解的),或在后续的优化过程中会表现地
比较差(这种情况可以看做,搜索算法,通过指定搜索的步长,如运筹学中的黄金分割算法,
可能出现函数值超过的情况)
考虑算法的停止问题基本上就是没通过迭代若干步数进行更新后,进行停止条件检查,
故在步数上要使用的运算是取余,当整除条件达到时,进行停止条件的检查。
条件检查在达到最优化目标后要指定跳出算法循环的条件,下面的伪代码中是使用
当具有较好表现时(this_validation_loss < best_validation_loss * improvement_threshold)
设定更大的patience(patience = max(patience, iter * patience_increase))
以帮助跳出循环条件(iter < patience)
这里也是通过伪代码来进行展示:
从算法的实现上可以看出,此算法当先执行完minibatch更新部分后,如达到了跳出
条件则通过done_looping跳出循环,当执行过若干次minibatch后还不能,会根据
while循环继续对参数进行求解,直至达到跳出条件或循环步数n_epochs.
一些基本概念 及模型的介绍,
有关图片识别的部分被指定为像素的float表示,label的int表示。
在有关模型的讨论中数据集被分割为三部分:train_set valid_set test_set
分别以numpy的数组方式进行储存
valid_set用于选择超参数
基本的实现先说明分类模型,对于分类方法,所指定的是概率上的最大值问题,
条件概率,条件概率中的超参数由valid_set中的数据进行决定。
最简单的classify方法是使用0-1损失函数,使用条件概率函数的最大值作为估计
进行构造。
相应的theano:
zero_one_loss = T.sum(T.neq(T.argmax(p_y_give_x), y))
默认的T.argmax实现flattened 方向的最大下标求解,即横向,axis参数的使用
方法与numpy相同。
T.neq (not equal)
另外一种损失是负的对数似然函数,原因是明显的,数理统计。
相应的theano:
NLL = -T.sum(T.log(p_y_given_x)[T.arange(y.shape[0]), y])
在优化问题中比如随机梯度这种求解参数的方法有更新迭代的方式,
一般是使用的步长被称为学习率(learning rate)。
不同的梯度算法体现在损失函数的不同,一般梯度下降使用所有样本定义
损失函数,随机梯度下降使用单个样本定义损失函数,minibatch梯度下降
使用某些样本定义损失函数。
利用一般的梯度下降算法的过程可以概括为如下伪代码。(是对所有样本的使用)
while True:
loss = f(params)
d_loss_wrt_params = ... # compute gradient
params -= learning_rate * d_loss_wrt_params
if <stopping condition is met>:
return params
随机梯度下降是将while这个无穷的循环转换为对单个样本的使用,下面是伪代码:
for (x_i, y_i) in training_set:
loss = f(params, x_i, y_i)
d_loss_wrt_params = ...# compute gradiemt
params -= learning_rate * d_loss_wrt_params
if <stopping condition is met>:
return params
minibatch梯度下降:
for (x_batch, y_batch) in train_batches:
loss = f(params, x_batch, y_batch)
d_loss_wrt_params = ...# compute gradient
params -= learning_rate * d_loss_wrt_params
if <stopping condition is met>:
return params
在Theano中实现上述算法(伪代码)的过程可以概括为:
d_loss_wrt_params = T.grad(loss, params)
updates = [(params, params - learning_rate * d_loss_wrt_params)]
MSGD = theano.function([x_batch, y_batch], loss, updates = updates)
for (x_batch, y_batch) in train_batches:
print 'Current loss is ', MSGD(x_batch, y_batch)
if stopping_condition_is_met:
return params
有关正则化的讨论在对于Ridge Regression 及Lasso Regression的相关内容
中已经进行了比较完备的讨论,其形式也是比较简单的,如下:
L1 = T.sum(T.abs(params))
L2 = T.sum(params ** 2)
loss = NLL + lambda_1 *L1 + lambda_2 * L2
下面是在优化问题中也会讨论到的一个方面,即求解算法的停止问题。
决定算法停止一般是通过valid_set的相关训练得到(此部分数据与train_set test_set
相独立),当所进行的优化表现在valid_set表现地足够好(对于这种情况,本质上可以看
做泛函分析中迭代不动点的收敛问题,故得到最优解的),或在后续的优化过程中会表现地
比较差(这种情况可以看做,搜索算法,通过指定搜索的步长,如运筹学中的黄金分割算法,
可能出现函数值超过的情况)
考虑算法的停止问题基本上就是没通过迭代若干步数进行更新后,进行停止条件检查,
故在步数上要使用的运算是取余,当整除条件达到时,进行停止条件的检查。
条件检查在达到最优化目标后要指定跳出算法循环的条件,下面的伪代码中是使用
当具有较好表现时(this_validation_loss < best_validation_loss * improvement_threshold)
设定更大的patience(patience = max(patience, iter * patience_increase))
以帮助跳出循环条件(iter < patience)
这里也是通过伪代码来进行展示:
from __future__ import division
patience = 5000
patience_increase = 2
improvement_threshold = 0.995
validation_frequency = min(n_train_batches, patience / 2)
best_params = None
best_validation_loss = numpy.inf
test_score = 0.
start_time = time.clock()
done_looping = False
epoch = 0
while (epoch < n_epochs) and (not done_looping):
epoch = epoch + 1
for minibatch_index in xrange(n_train_batches):
d_loss_wrt_params = ...# compute gradient
params -= learning_rate * d_loss_wrt_params
iter = (epoch - 1) * n_train_batches + minibatch_index
if (iter + 1) % validation_frequency == 0:
this_validation_loss = ... # compute 0-1 Loss on validation set
if this_validation_loss < best_validation_loss:
if this_validation_loss < best_validation_loss * improvement_threshold:
patience = max(patience, iter * patience_increase)
best_params = copy.deepcopy(params)
best_validation_loss = this_validation_loss
if patience <= iter:
done_looping = True
break
从算法的实现上可以看出,此算法当先执行完minibatch更新部分后,如达到了跳出
条件则通过done_looping跳出循环,当执行过若干次minibatch后还不能,会根据
while循环继续对参数进行求解,直至达到跳出条件或循环步数n_epochs.