Solve the wheat problem
昨天大部分时间都花在了解决种子问题上了
现在回想起来种子问题有两个难点
第一: 输入的量级比较乱,有些在10-20之间波动,有些在0.1-0.9波动,相差了快100倍
第二: 多分类问题
前天我用relu-based的手写2-4-1神经网络把XOR问题解决了
结构是中间4个relu的unit, 输出就一个线性unit
因为输出是线性单元所以是实数,但是label是0和1的集合
我依赖Batch Gradient Decent,用线性输出去逐渐逼近0跟1的结果
这就是第一个tricky的地方,我现在吸取了一个教训:任何时候输出都应该跟label的域保持一致
为什么呢?因为如果域不一样的话,error会非常大,经常会stackoverflow
而且仔细想想,这样对rate的精度要求一定很高, 让线性去逼近0和1本来就是无茶苦茶不是吗
任何时候输出都应该跟label的域保持一致, 这是我学会的第一个教训
刚刚做了个实验,在XOR的问题中,用了sigmoid作为最终输出(限制在0和1, 然后用总体方差作为损失函数)
结果 一样没法收敛。。
再次证明BGD太容易掉Local Minima了
回到种子问题上
一开始我打算用7-4-1的网络来做
实验过程各种stackoverflow,根本没法实验
原因就是input没有scale
然后我花了一个上午去找input normalize的方案
有两种方案分别是normalize和standalize,后者是我deviation来表示input,蛮玄学的
我用了前者,当然,结果一样是没法收敛,记得好像是一直在50% - 60%左右
所以百般无奈我只好加到3个输出unit,用softmax作为输出层activation
softmax的导数有点tricky花了我不少时间
改bug也是
但是最终都在傍晚前解决了
预测准确率在94%左右, 基本和那个教程一样
因为用的是SGD所以曲线非常不平滑是必然的
所以我得到的教训就是2点:
- 对input做normalize操作
- 确保输出域和label域一致