请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

机器学习(ML)八之正向传播、反向传播和计算图,及数值稳定性和模型初始化

[复制链接]
查看: 43|回复: 0

3万

主题

3万

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
91650
发表于 2020-2-15 16:09 | 显示全部楼层 |阅读模式
正向传播

我的关键词 机械进修(ML)八之正向传布、反向传布和计较图,及数值稳定性和模子初始化  热门消息 1473572-20200215135623455-862075389

正向传播的盘算图

凡是绘制盘算图来可视化运算符和变量在盘算中的依靠关系。下图绘制了本节中样例模子正向传播的盘算图,其中左下角是输入,右上角是输出。可以看到,图中箭头偏向大多是向右和向上,其中方框代表变量,圆圈代表运算符,箭头表示从输入到输出之间的依靠关系。
我的关键词 机械进修(ML)八之正向传布、反向传布和计较图,及数值稳定性和模子初始化  热门消息 1473572-20200215135829331-761303832

反向传播

我的关键词 机械进修(ML)八之正向传布、反向传布和计较图,及数值稳定性和模子初始化  热门消息 1473572-20200215142705586-1423207245

练习深度进修模子

在练习深度进修模子时,正向传播和反向传播之间相互依靠。一方面,正向传播的盘算大要依靠于模子参数确当前值,而这些模子参数是在反向传播的梯度盘算后经过优化算法迭代的而这些当前值是优化算法近来一次按照反向传播算出梯度后迭代获得的。另一方面,反向传播的梯度盘算大要依靠于各变量确当前值,而这些变量确当前值是经过正向传播盘算获得的。这个当前值是经过从输入层到输出层的正向传播盘算并存储获得的。是以,在模子参数初始化完成后,我们交替地举行正向传播和反向传播,并按照反向传播盘算的梯度迭代模子参数。既然我们在反向传播中操纵了正向传播中盘算获得的中心变量来禁止反复盘算,那末这个复用也致使正向传播竣事后不能立即开释中心变量内存。这也是练习要比猜测占用更多内存的一个严重原因原由。别的需要指出的是,这些中心变量的个数大要上与收集层数线性相关,每个变量的巨细跟批量巨细和输入个数也是线性相关的,它们是致使较深的神经收集操纵较多量量练习时更轻易超内存的首要原因原由。
数值安定性和模子初始化

明白了正向传播与反向传播今后,我们来会商一下深度进修模子的数值安定性题目以及模子参数的初始化方式。深度模子有关数值安定性的典型题目是衰减(vanishing)和爆炸(explosion)。
衰减和爆炸

我的关键词 机械进修(ML)八之正向传布、反向传布和计较图,及数值稳定性和模子初始化  热门消息 1473572-20200215143123887-1150969330




在神经收集合,凡是需要随机初始化模子参数。下面我们来表白这样做的原因原由。
回首“多层感知机”一节图描摹的多层感知机。为了方便表白,假定输出层只保存一个输出单元o1">o1(删去o2">o2和o3">o3以及指向它们的箭头),且匿伏层操纵不异的激活函数。假如将每个匿伏单元的参数都初始化为相称的值,那末在正向传播时每个匿伏单元将按照不异的输入盘算出不异的值,并转达至输出层。在反向传播中,每个匿伏单元的参数梯度值相称。是以,这些参数在操纵基于梯度的优化算法迭代后值仍然相称。以后的迭代也是如此。在这类情况下,不管匿伏单元有几多,匿伏层本质上只要1个匿伏单元在发挥感化。是以,正如在前面的实行中所做的那样,我们凡是将神经收集的模子参数,特别是权重参数,举行随机初始化。
MXNet的默许随机初始化

随机初始化模子参数的方式有很多。在“线性回归的简洁实现”一节中,我们操纵net.initialize(init.Normal(sigma=0.01))使模子net的权重参数采取正态散布的随机初始化方式。假如不指定初始化方式,如net.initialize(),MXNet将操纵默许的随机初始化方式:权重参数每个元素随机采样于-0.07到0.07之间的均匀散布,毛病参数全数清零。
Xavier随机初始化

还有一种比力常用的随机初始化方式叫作Xavier随机初始化。 假定某全毗连层的输入个数为a">a,输出个数为b">b,Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀散布
我的关键词 机械进修(ML)八之正向传布、反向传布和计较图,及数值稳定性和模子初始化  热门消息 1473572-20200215143533841-1997407093



它的设想首要考虑到,模子参数初始化后,每层输出的方差不应受该层输入个数影响,且每层梯度的方差也不应受该层输出个数影响。
实战Kaggle角逐:房价猜测代码实现

我的关键词 机械进修(ML)八之正向传布、反向传布和计较图,及数值稳定性和模子初始化  热门消息 ContractedBlock
我的关键词 机械进修(ML)八之正向传布、反向传布和计较图,及数值稳定性和模子初始化  热门消息 ExpandedBlockStart
  1.   1 #!/usr/bin/env python  2 # coding: utf-8  3   4 # In[1]:  5   6   7 # 假如没有安装pandas,则反诠释下面一行  8 # !pip install pandas  9  10 get_ipython().run_line_magic('matplotlib', 'inline') 11 import d2lzh as d2l 12 from mxnet import autograd, gluon, init, nd 13 from mxnet.gluon import data as gdata, loss as gloss, nn 14 import numpy as np 15 import pandas as pd 16  17  18 # In[2]: 19  20  21 train_data = pd.read_csv('./data/kaggle_house_pred_train.csv') 22 test_data = pd.read_csv('./data/kaggle_house_pred_test.csv') 23  24  25 # In[3]: 26  27  28  29 train_data.shape 30  31  32 # In[4]: 33  34  35 test_data.shape 36  37  38 # In[5]: 39  40  41 train_data.iloc[0:4, [0, 1, 2, 3, -3, -2, -1]] 42  43  44 # In[6]: 45  46  47 all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:])) 48  49  50 # ### 预处置惩罚数据 51 # 我们对持续数值的特征做标准化(standardization):设该特征在全部数据集上的均值为μ,标准差为σ。那末,我们可以将该特征的每个值先减去μ再除以σ获得标准化后的每个特征值。对于缺失的特征值,我们将其更换成该特征的均值。 52  53 # In[7]: 54  55  56 numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index 57 all_features[numeric_features] = all_features[numeric_features].apply( 58     lambda x: (x - x.mean()) / (x.std())) 59 # 标准化后,每个特征的均值变成0,所以可以间接用0来更换缺失值 60 all_features[numeric_features] = all_features[numeric_features].fillna(0) 61  62  63 # 接下来将离散数值转成指示特征。举个例子,假定特征MSZoning里面有两个分歧的离散值RL和RM,那末这一步转换将去掉MSZoning特征,并新加两个特征MSZoning_RL和MSZoning_RM,其值为0或1。假如一个样本本来在MSZoning里的值为RL,那末有MSZoning_RL=1且MSZoning_RM=0。 64  65 # In[9]: 66  67  68 # dummy_na=True将缺失值也看成正当的特征值并为其建立指示特征 69 all_features = pd.get_dummies(all_features, dummy_na=True) 70 all_features.shape 71  72  73 # 可以看到这一步转换将特征数从79增加到了331。 74 #  75 # 末端,经过values属性获得NumPy格式的数据,并转成NDArray方便背面的练习。 76  77 # In[10]: 78  79  80 n_train = train_data.shape[0] 81 train_features = nd.array(all_features[:n_train].values) 82 test_features = nd.array(all_features[n_train:].values) 83 train_labels = nd.array(train_data.SalePrice.values).reshape((-1, 1)) 84  85  86 # In[11]: 87  88  89 loss = gloss.L2Loss() 90  91 def get_net(): 92     net = nn.Sequential() 93     net.add(nn.Dense(1)) 94     net.initialize() 95     return net 96  97  98 # 下面界说角逐用来评价模子的对数均方根毛病。给定猜测值$\hat y_1, \ldots, \hat y_n$和对应的实在标签$y_1,\ldots, y_n$,它的界说为 99 # 100 # $$\sqrt{\frac{1}{n}\sum_{i=1}^n\left(\log(y_i)-\log(\hat y_i)\right)^2}.$$101 #  102 # 对数均方根毛病的实现以下。103 104 # In[12]:105 106 107 def log_rmse(net, features, labels):108     # 将小于1的值设成1,使得取对数时数值更安定109     clipped_preds = nd.clip(net(features), 1, float('inf'))110     rmse = nd.sqrt(2 * loss(clipped_preds.log(), labels.log()).mean())111     return rmse.asscalar()112 113 114 # In[13]:115 116 117 def train(net, train_features, train_labels, test_features, test_labels,118           num_epochs, learning_rate, weight_decay, batch_size):119     train_ls, test_ls = [], []120     train_iter = gdata.DataLoader(gdata.ArrayDataset(121         train_features, train_labels), batch_size, shuffle=True)122     # 这里操纵了Adam优化算法123     trainer = gluon.Trainer(net.collect_params(), 'adam', {124         'learning_rate': learning_rate, 'wd': weight_decay})125     for epoch in range(num_epochs):126         for X, y in train_iter:127             with autograd.record():128                 l = loss(net(X), y)129             l.backward()130             trainer.step(batch_size)131         train_ls.append(log_rmse(net, train_features, train_labels))132         if test_labels is not None:133             test_ls.append(log_rmse(net, test_features, test_labels))134     return train_ls, test_ls135 136 137 # ### K 折穿插考证138 # 我们在“模子挑选、欠拟合和过拟合”中先容了K折穿插考证。它将被用来挑选模子设想并调节超参数。下面实现了一个函数,它返回第i折穿插考证时所需要的练习和考证数据。139 140 # In[14]:141 142 143 def get_k_fold_data(k, i, X, y):144     assert k > 1145     fold_size = X.shape[0] // k146     X_train, y_train = None, None147     for j in range(k):148         idx = slice(j * fold_size, (j + 1) * fold_size)149         X_part, y_part = X[idx, :], y[idx]150         if j == i:151             X_valid, y_valid = X_part, y_part152         elif X_train is None:153             X_train, y_train = X_part, y_part154         else:155             X_train = nd.concat(X_train, X_part, dim=0)156             y_train = nd.concat(y_train, y_part, dim=0)157     return X_train, y_train, X_valid, y_valid158 159 160 # In[15]:161 162 163 #在 K 折穿插考证中我们练习 K 次并返回练习和考证的均匀毛病。164 def k_fold(k, X_train, y_train, num_epochs,165            learning_rate, weight_decay, batch_size):166     train_l_sum, valid_l_sum = 0, 0167     for i in range(k):168         data = get_k_fold_data(k, i, X_train, y_train)169         net = get_net()170         train_ls, valid_ls = train(net, *data, num_epochs, learning_rate,171                                    weight_decay, batch_size)172         train_l_sum += train_ls[-1]173         valid_l_sum += valid_ls[-1]174         if i == 0:175             d2l.semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'rmse',176                          range(1, num_epochs + 1), valid_ls,177                          ['train', 'valid'])178         print('fold %d, train rmse %f, valid rmse %f'179               % (i, train_ls[-1], valid_ls[-1]))180     return train_l_sum / k, valid_l_sum / k181 182 183 # In[16]:184 185 186 #模子挑选----我们操纵一组未经调优的超参数并盘算穿插考证毛病。可以修改这些超参数来尽大要减小均匀测试毛病。187 k, num_epochs, lr, weight_decay, batch_size = 5, 100, 5, 0, 64188 train_l, valid_l = k_fold(k, train_features, train_labels, num_epochs, lr,189                           weight_decay, batch_size)190 print('%d-fold validation: avg train rmse %f, avg valid rmse %f'191       % (k, train_l, valid_l))192 193 194 # In[17]:195 196 197 #猜测并在Kaggle提交结果198 def train_and_pred(train_features, test_features, train_labels, test_data,199                    num_epochs, lr, weight_decay, batch_size):200     net = get_net()201     train_ls, _ = train(net, train_features, train_labels, None, None,202                         num_epochs, lr, weight_decay, batch_size)203     d2l.semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'rmse')204     print('train rmse %f' % train_ls[-1])205     preds = net(test_features).asnumpy()206     test_data['SalePrice'] = pd.Series(preds.reshape(1, -1)[0])207     submission = pd.concat([test_data['Id'], test_data['SalePrice']], axis=1)208     submission.to_csv('submission.csv', index=False)209 210 211 # In[18]:212 213 214 train_and_pred(train_features, test_features, train_labels, test_data,215                num_epochs, lr, weight_decay, batch_size)
复制代码
View Code
免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 WAYSFOCUS 影像 你 我 他,中国商业影视一站式解决平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表