文章目录
三个集合 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不动,说不定效果更好
- 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的调参没看了= =