d2l (1) basic




花书笔记


三个集合 train validation test

https://zhuanlan.zhihu.com/p/35394638
https://blog.csdn.net/Chaolei3/article/details/79270939

  • train 是数据调参
  • validation 是人工调参
  • 而验证集用于模型的选择,更具体地来说,验证集并不参与学习参数的确定,也就是验证集并没有参与梯度下降的过程。验证集只是为了选择超参数,比如网络层数、网络节点数、迭代次数、学习率这些都叫超参数。比如在k-NN算法中,k值就是一个超参数。所以可以使用验证集来求出误差率最小的k。
  • 一般在是从训练集里面进一步划分training set和validation set
* k 折交叉验证  -- 人如其名,k折的是验证集

在这里插入图片描述

  • test只是最终用来查看泛化能力的 --》 只用一次

然而在实际应用中,由于数据不容易获取,测试数据极少只使用一次就丢弃。
因此,实践中验证数据集和测试数据集的界限可能比较模糊。

  • 从严格意义上讲,除非明确说明,否则本书中实验所使用的测试集应为验证集,实验报告的测试结果(如测试准确率)应为验证结果(如验证准确率)。



头梯度和链式法则

在这里插入图片描述
头梯度一般用Tensor.ones_like(Tensor自己本身),实际上是个加权的过程
在这里插入图片描述




build from scratch 的注意点

在求square_loss得时候需要对y进行reshape/view

在这里插入图片描述
这里要牵扯到Tensor的广播机制原理(见下方)
所以y_hat和y如果shape不一致就会导致broadcasting的错误,然后lse莫名很大

e.g.
y_hat.size() == Tensor( [ batch_size ] )
y.size() == Tensor( [ batch_size,1 ] )
此时得到的结果矩阵就是 [ batch_size, batch_size ]的规格 = =

至于是对y_hat reshape还是对y reshape,效果都是一样的


broadcasting

举个例子看看广播是怎样广播的

在这里插入图片描述

广播最后得到的结果就是一个m*n的矩阵,m=max( row of x ,row of y ) , n=max( row of x ,row of y )
另外,再看一个细小的差别:

a = torch.arange(1, 3)  #.view(1, 2)
print(a)
>>tensor([1, 2])

print(a.size())
>>torch.Size([2])

b = torch.arange(1, 4).view(3, 1)
print(b)

>>tensor([[1],
        [2],
        [3]])
print(a + b)
>>tensor([[2, 3],
        [3, 4],
        [4, 5]])


这里a的size是tensor([2]),但是和tensor([1,2])的处理结果是一样看待的 ==》 你可以看作是默认生成的是一个行向量 (which 和我们数学中默认定义的是列向量的直觉相反 )

  • pytorch 实现的 mse_loss( ) 函数则要求传进去的两个参数的size必须一致

在这里插入图片描述


在每个batch-training的时候要在迭代的最后对参数进行.grad.zero_()

因为在第一次循环的时候参数还没有有grad ( print( w.grad ) --> None ),所以要放在循环最后面,先进行一次求导再进行清零


sgd采用的是for循环对每个para进行梯度下降

年少无知,还写了个mySGD ,结果发现parameters是一个参数的list,这里的for循环是针对参数list里面的所有参数类,而不是针对参数矩阵里面的每个元素
在这里插入图片描述
在这里插入图片描述
如果这里换成mySGD就会报错,因为传进去的参数是个list,连维度都不一样如何整体梯度下降

至于为什么不把所有参数整成同一个tensor传进去 ,还是那句话 ==》 维度都不一样



分类问题里面为什么不把-accuracy当成loss_function

  • 没法儿求导啊 --》 多分类用MSE也不是很合理,还是交叉熵比较好

在这里插入图片描述


交叉熵相关

  • 构造的时候使用tensor.gather()

  • softmax和交叉熵分开来计算会使得数值不稳定 --》loss = nn.CrossEntropyLoss()

  • 对于线性分类问题 y =f( wx+b )

f是激活函数

这里的f( · ) 是softmax是可以用贝叶斯定理推出来的(详见模式识别第四章节)

这种解释还是有点牵强,比较适合不理解背后体系机理的人看:
在这里插入图片描述

进一步的,对相应的x的分布进行建模以后,使用MLE求解后验的参数 ,就会等价于交叉熵的形式

感觉这个解释也比较牵强= =在这里插入图片描述

另一个角度看(不从概率角度看了),为什么不用MSE而是用ACE(average cross entropy)

https://blog.csdn.net/xg123321123/article/details/80781611
softmax + MSE的结合得到的数值波动很大,而softmax +CE得到的是一个下凸函数,使用随机梯度可以很好收敛

  • 从上面那个link引申出了一个新的有趣的问题–》为什么回归问题用 MSE而不用CE?

如果预测结果任意取一个值,比如 -1.5,就没法计算 log(-1.5),所以一般不用交叉熵来优化回归问题。
再回到概率角度看 --》 MSE是MLE和MAP推导出来的等价结果欸



MLP

  • sigmoid函数导数

在这里插入图片描述在这里插入图片描述

  • tanh函数导数

在这里插入图片描述在这里插入图片描述

这两者都是: 当输入为0时,函数的导数达到最大值1;当输入越偏离0时,函数的导数越接近0。



weight -decay

  • 在optimizer里面加入的wd=xx,就是lambda的大小,做的实际上就是在这里插入图片描述
    此时loss函数里面不需要手动加惩罚项了

  • lm认为b项是否和w在一起参与惩罚无所谓
    (他认为这就是统计学和dl实操的不同之处)

调参经验

  • 随着weight -decay的增大,模型的l2-norm确实减少得更快了
  • 但是并不意味着训练效果更好 ==》 wd实际上也是作用在参数上,有点像参数得学习率,所以如果lr太大,也不一定会号–》 震荡



batch norm

  • motivation?
  • 需要有拉伸和提升的参数
  • lr会设置高一点
  • train和test的实现是不一样的
  • 最终结果不会有很大提升,但是会加快收敛速度



note

  • 在写代码的时候要想好数据到底放在cpu还是gpu里面





*


琐碎经验

linux指令

  • screen

    • 高级功能like 屏幕分割之类的 ??
    • 创建
      screen -S sessionName
      screen vi test.txt 退出vi就会退出screen
    • 挂后台
      [ctr+a ]+d

    ctrl+a 是进入命令模式的快捷键

    • 恢复screen
      screen -r sessionName / uid
    • 查看所有screen
      screen -ls
    • 判断当前是否在screen中
      echo $STY
    • 退出当前screen进程
      exit 或者 [ctr+a ]+ k ( 反正这个快捷键我是从来没有成功过
    • 杀死已经死亡的 (dead )
      screen --wipe
    • 杀死unattached
      screen -X -S sessionName/id quit

    screen -X -S sessionName/id command # 这里的sessionName/id都不一定要写完 保证unique即可

more detail refer to https://blog.csdn.net/hejunqing14/article/details/50338161

  • pstree -up [pid]

  • conda
    condat create -f?
    conda env update -f environment.yml ??

  • pid是进程,spid是线程,linux没有线程,是用进程模仿的

  • 远程端口映射 ssh -L8000:localhost:8008 ip ??

http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
https://www.zhihu.com/question/52943496
似乎是翻墙必备
所以这个东西是在远程服务器上进行访问,然后本地啥都不用安装是嘛

  • w= np.random.normal( 0, 0.01, tuple size ) # 这个初始化的重要性??

question

  • linux查找的命令
    http://www.ruanyifeng.com/blog/2009/10/5_ways_to_search_for_files_using_the_terminal.html
    https://blog.csdn.net/wzzfeitian/article/details/40985549
    https://blog.csdn.net/ydfok/article/details/1486451

  • 李沐

李沐:苹果面试题: 为啥lr稍微调大一点,就效果很差
在这里插入图片描述
answer: 这个在第六课里面有个博士生出来解答了

有时候有error也不见得train不动,说不定效果更好

  1. test_acc比train_acc要好? test_acc跟train-acc都差不多了 不能再调了~

梓帆,这是可能的 ,后面train着train着就回去了!

  • vscode markdown预览字体调整

  • fresh copy??

  • [讨论题]

    • 回顾一下训练误差和泛化误差的关系。除了权重衰减、增大训练量以及使用复杂度合适的模型,你还能想到哪些办法来应对过拟合?
    • 调节实验中的权重衰减超参数,观察并分析实验结果。

    ok

    • 如果你了解贝叶斯统计,你觉得权重衰减对应贝叶斯统计里的哪个重要概念?

    沐神 :理论上,对于feature是standardized的(x-mean(x) )/ std(x),L2 norm才应该使用。即便standardized了,但实际中很难说加了正则化结果一定就好。
    为什么这里feature要正则化??看看prml是怎么说这个来着= =

  • 我觉得不啊 梯度不应该跟相应的数据也有关系吗= =
    在这里插入图片描述

  • 这个导包机制我是真的迷了= =

import utils了,其中utils里import了plt 但是我这个文件本身没有import ,但是我调用的utils里面的函数用到了plt,他就运行的好好的,但是我现在使用plt就不行??

  • 我原本以为 在当前文件进行import plt,然后和utils里面的plt变量就不一样,没想到 居然一样的??–》 which means utils里面的plt变量似乎就是我当前文件中定义的这个
  • 3.13-3.15应该还可以再看看书 还有讨论区 = = drop out的调参没看了= =
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值