Witllm/binary/readme.md

39 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 定义
### 梯度
1. 预测变化对整体损失 L 的影响程度, 参数θ在当前点的变化对损失值的影响方向和幅度
2. grad物理含义loss L = 0 的时候,需要的变化量
3. w = w - grad * lr 若梯度为正,权重应该减小
4. w_grad = output_grad * input, input越大grad越大w调整的量越大
1. input越大->对weight的放大倍数越大->才能达到loss=0的调整量
2. 所以weight的调整比例应该越大才能弥补小input的loss=0
5. 梯度的大小反应了影响损失的“快慢”
1. 梯度大​​ → 损失曲面陡峭 → 微小变化导致损失剧烈波动
2. 梯度大微小变化就可以使得loss变化一个单位
2. 梯度大和loss的关系越相关
## 问题
* 在一串的binary lut网络中
1. 如果每个卷积的channel相互之间没有关系
2. 中间插入一层交换各个channel之间的数据生成新的相同数量的channel
3. 方法2的效果很差
1. 好像是破坏了训练,可能是训练的方法不对,梯度下降不适合这种模型
2. 最终分类是1010个输出之间有关系就会很差
* LUT层梯度计算的问题
1. 发现LUT的反向计算grad_weight没有考虑weight本来的正负符号grad表示的是>0的置信度
1. 考虑梯度符号之后,由于整个选择的梯度是一个,没有机会变换到别的
2. weight_grad:后面一级计算的grad_input对于当前weight的grad是一样的没有机会变换到别的
3. 当前的选择不可信后的grad会导致直接0/1整体取反,而不会改变分布
2. 输出级别用于criterion的LUT的梯度计算和基于Binary的输出1概率的梯度的计算方式不一样
1. LUT的是输出1的概率不能直接和criterion的梯度进行下降
3. grad input的目标是要不要更换别的index
1. 梯度的大小表示更换别的index的程度
2. 梯度正负无所谓,需要随机?
* unfold输出的维度不对
1. LUT不是对卷积核进行计算,更容易收敛,但是精度没有更高
2. LUT不是对卷积核进行计算,不容易收敛,精度差不多
* 好像只有AdamW优化器可以优化参数明显收敛
* LUT的输出进行二值化对精度有影响大概94->81