Witllm/binary
Colin 392f507945 Add llamafactory, Refine binary LUT add SimpleLNN. 2025-06-06 17:25:04 +08:00
..
cudagraph.py Refine mnist LUT by add lutCNN. 2025-05-27 18:51:07 +08:00
loss.py Update demo and readme. 2025-06-05 13:17:01 +08:00
mnist.py Add llamafactory, Refine binary LUT add SimpleLNN. 2025-06-06 17:25:04 +08:00
readme.md Update demo and readme. 2025-06-05 13:17:01 +08:00
unfold.py Refine mnist LUT by add lutCNN. 2025-05-27 18:51:07 +08:00

readme.md

定义

梯度

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