Deep Learning 初探(一)

来源:互联网 发布:网络监控工作的短板 编辑:程序博客网 时间:2024/05/17 07:27
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)


这里也是通过伪代码来进行展示:
from __future__ import divisionpatience = 5000patience_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 + 1for minibatch_index in xrange(n_train_batches):d_loss_wrt_params = ...# compute gradientparams -= learning_rate * d_loss_wrt_paramsiter = (epoch - 1) * n_train_batches + minibatch_indexif (iter + 1) % validation_frequency == 0:this_validation_loss = ... # compute 0-1 Loss on validation setif 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_lossif patience <= iter:done_looping = True break




从算法的实现上可以看出,此算法当先执行完minibatch更新部分后,如达到了跳出
条件则通过done_looping跳出循环,当执行过若干次minibatch后还不能,会根据
while循环继续对参数进行求解,直至达到跳出条件或循环步数n_epochs.

























0 0
原创粉丝点击