监督学习基本概念和深度学习训练模型基础

星期六, 01. 六月 2019 03:22下午

  • 注: 博客关于监督学习内容参考李航《统计学习方法》第一版,目前该书已经于5月份已经出了第二版,在原来监督学习的基础上加入了非监督学习的内容。
  • 深度学习内容为笔者实践中总结出来的些许经验,与大家一起分享。
  • 理解基本概念对以后的学习很重要。

一、监督学习基本概念

1 问题的形式化

统计学习包括监督学习、半监督学习、非监督学习和强化学习。
监督学习假设输入与输出的随机变量XY遵循联合概率分布P(X, Y),但是实际中,联合概率分布的定义是未知的。但是,统计学习认为数据存在一定的统计规律---数据(训练数据和测试数据)是由联合概率分布P(X, Y)独立同发布产生的。这是监督学习关于数据的基本假设。
监督学习的目的在于学习一个由输入到输出的映射(模型),这个模型可以是概率模型P(y|x),也可以是非概率模型y=f(x),非概率模型也就是决策函数。在预测时(假设测试集输入为x_{n+1},概率模型的输出为y_{n+1}=argmax(P(y_{n+1}|x_{n+1})), 决策函数的输出为y_{n+1}=f(x_{n+1})

2 损失函数(结构风险与经验风险)

损失函数是用来度量预测错误的程度,常用的有0-1损失函数,平方损失函数,绝对值损失函数和对数损失函数,损失函数由记号L(Y, f(x))表示。显然损失函数越小,模型就越好,由于模型输入输出遵循联合概率分布,损失函数的期望为:
R_{exp}(f)=E_p[L(Y,f(x))]=\int_{X×Y} L(y, f(x))P(x,y)dxdy
这是理论上模型关于联合分布在平均意义下的损失,称为风险函数。实际中,在给定训练集T=\lbrace(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\rbrace,模型关于训练集的平均损失为经验风险:
R_{emp}(f)=\frac{1}{N}\sum_{i=1}^NL(y_i,f(x_i))
按照经验风险模型最小化求最优模型就是求解最优化问题:
min\ R_{emp}(f)=min\ \frac{1}{N}\sum_{i=1}^NL(y_i,f(x_i))
但是,当样本容量很小时,经验风险最小化学习的效果未必好,会产生过拟合,结构化风险是为了防止过拟合而提出来的策略。结构化风险等价于正则化,结构化风险的定义为:
R_{srm}(f)=\frac{1}{N}\sum_{i=1}^NL(y_i,f(x_i))+{\lambda} J(f)
其中J(f)为模型复杂度,\lambda \geq 0是系数,用以权衡经验风险和模型复杂度。结构风险小的模型往往对训练数据以及未知数据有较好的预测,它的最优化问题为:
min\ R_{srm}(f)=min\ \frac{1}{N}\sum_{i=1}^NL(y_i,f(x_i))+{\lambda} J(f)

3 正则化与S折交叉验证

{\lambda} J(f)即为正则项,正则项一般是模型复杂度的单调递增函数。例如回归问题中,损失函数是平方损失函数,正则项可以是参数向量的L_2范数:
L(w)=\frac{1}{N}\sum_{i=1}^{N}(f(x_i;w)-y_i)^2+\frac{\lambda}{2}||w||_2^2)
正则项可以是参数向量的L_1范数:
L(w)=\frac{1}{N}\sum_{i=1}^{N}(f(x_i;w)-y_i)^2+\lambda ||w||_1)
S折交叉验证为应用最多的交叉验证方法(主要用于选参数),方法如下:

  • 首相随机地将已知数据切分为S个互不相交的大小相同的子集;
  • 然后利用S-1个子集的数据训练模型,利用余下的子集训练模型;
  • 将这一过程重复S次
  • 最后选择S次测评中平均测试误差最小的模型

二、深度学习训练模型基础

深度学习训练模型笔者也是刚刚开始,笔者这次用的模型是多层LSTM+FC,主要用于时间序列(故障信号)的分类,这次讲的主要是一些如何控制过拟合和如何提高训练的速度。

1 提高GPU的利用率

GPU的利用率高低对于合理利用GPU很重要,在训练模型时,非常有必要将利用率提高到80%以上,主要有两个方法:

(1) 控制GPU内存,用如下代码实现

import os
os.environ["CUDA_VISIBLE_DEVICES"] = '0' # 使用GPU: 0
config = tf.ConfigProto()
# config.gpu_options.per_process_gpu_memory_fraction = 0.5  # 程序最多只能占用指定gpu50%的显存
config.gpu_options.allow_growth = True # 根据运行需求分配GPU内存
sess = tf.Session(config=config)

(2) 减少数据频繁读写

数据频繁读写会使得GPU的利用率在0~100%之间快速的变化,此时GPU平均的利用率就很低,遇到这种情况,需要增加batch_size,减慢数据的频繁读写,增大GPU的利用率。

2 train loss 与 validation loss 结果分析

  • train loss 不断下降,validation loss不断下降,说明网络仍在学习;
  • train loss 不断下降,validation loss趋于不变,说明网络过拟合;
  • train loss 趋于不变,validation loss不断下降,说明数据集100%有问题;
  • train loss 趋于不变,validation loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
  • train loss 不断上升,validation loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

3 采用early stop 控制过拟合

常用控制过拟合的方式有drop regularization (增加数据量),笔者这次主要讲early stop中的一种常用的实现方法:即当网络在连续多次训练中,validation loss趋于不变,网络就停止。具体的代码实现如下:

# previous_loss 前一次的loss
# current_loss 当前的loss
# Max_N 可以允许的n最大值
# Th_loss 可以允许的最大loss差值
# epoch 迭代周期
# best_iteration 最佳迭代次数
if abs(current_loss - previous_loss) < Th_loss:
    n += 1
    if n > Max_N:
       best_iteration = epoch + 1
       break
else:
    n = 0
previous_loss = current_loss

4 归一化和shuffle+(repeat)

采用归一化和shuffle主要目的是为了提高网络的训练速度。
采用StandardScaler()归一化的代码如下:

from sklearn.preprocessing import StandardScaler
ss = StandardScaler().fit(train_x)
train_x = ss.transform(train_x)
test_x = ss.transform(test_x)

shuffle的代码实现有很多种方式,可以是一周期shuffle一次或多次,也可以是每个batch shuffle一次或者多次

5 模型保存与加载

笔者这里只介绍保存全部模型(图和变量),加载整个模型的方式。
首先是保存整个模型:

saver = tf.train.Saver()
saver.save(sess, "./my_model_20190528/my_model_20190528")

保存结束后,在文件夹 my_model_20190528下面有4个子文件,分别为checkpoint my_model_20190528.data-00000-of-00001 my_model_20190528.index my_model_20190528.meta
然后在另一张图上加载刚刚保存的模型:

# 导入保存的图
new_saver = tf.train.import_meta_graph('./my_model_20190528/my_model_20190528.meta')

# 加载需要run的变量
graph = tf.get_default_graph()
accuracy = graph.get_tensor_by_name("Mean_1:0")
X = graph.get_tensor_by_name("Placeholder:0")
y = graph.get_tensor_by_name("Placeholder_1:0")
keep_prob = graph.get_tensor_by_name("Placeholder_2:0")

# 加载保存的模型
sess = tf.Session()
new_saver.restore(sess, './my_model/my_model')

keep_prob 在测试的时候应该设置为1.0

下次继续分享,欢迎留言

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容