第26章 计划大变(1/2)
之后的几天,陈一然继续窝在公寓里写代码。
就是当茉莉的人肉键盘,每天推个一两小时。deepflow 的自动微分引擎已经搭了个架子,但反向传播那块始终没跑通,茉莉昨天改了激活函数的实现,今天又要接著调。
【第十二行,把那个 sigmoid 换成 tanh,括號里改成 hidden_output。】
陈一然照著打,textmate 的代码补全倒是能弹出来,但弹的都是不相关的东西,他得一个字母一个字母敲。
【然后下面加一行,np.dot,参数是 error 和 hidden_output 的转置。】
“等等 —— 转置怎么写来著?”
【t,加在变量后面。】
他打完了,运行,terminal 里蹦出来一行报错。维度不匹配。
【hidden_output 的 shape 应该是 64 乘 1,你前面加一个 reshape。】
“哪一行?”
【第四十七行。】
他翻上去找到第四十七行,果然,少了个 reshape。加了,再跑,还是报。这回是 learning_rate 的问题,太大了,梯度爆炸。
陈一然靠在椅背上嘆了口气,这种调参的活最烦,不是逻辑错,就是数值不对,改一个地方牵一串。
茉莉理论都懂,但也得靠他一次次运行、看报错、改、再跑。
折腾了一个多小时,总算跑通了。
但 loss 掉得太慢了,一条几乎水平的线,两百个 epoch 才降了零点零几,照这个速度得跑到明年。
【可能是权重初始化的问题。目前用的是全零初始化,这会导致所有隱层神经元输出相同,反向传播时梯度也完全一样。】
“说人话。”
【把第二十三行和第二十五行的 np.zeros 改成 np.random.randn,除以 sqrt of hidden_size。】
“sqrt 就这么直接打吗?”
【np.sqrt,括號里写 hidden_size。】
两处都改完,试著运行了下。这回 loss 曲线明显陡了不少,但跑到第五十个 epoch 突然一个 nan 蹦出来,整个训练废了。
“又炸了。”
【learning_rate 还是太大。0.1 对隨机初始化来说偏高,先降到 0.01 试试。】
“刚才不是说 0.1 太大吗,怎么又大了?”
【之前是零初始化,梯度小,0.1 勉强能跑。现在换成隨机初始化,初始梯度大了,0.1 就过了。】
“你能不能一步到位?行了,今天先到这吧,我脑子都快炸了。话说,你就不能想好了,再让我打吗。”
【你的意思是,我可以对你的大脑进行更深度的调用,不用保持低状態运行了?如果可以,我可以完全推演大部分运行情况。请提前准备好补给品和冰块。】
“没!我说说的,这样挺好。”
不再理天天说真话很烦人的茉莉,陈一然打电话叫了个披萨。
刚要放下电话,徐力的简讯就来了:“提单到了!货代刚发我邮箱了!我给你也发了一份,这个要给国內看吧。”
陈一然去电脑上开 gmail,果然有一封徐力转发的 global auto shipping 邮件,標题 “bill of lading - 2x cayenne - tianjin”。提单附件打开扫了一眼 —— 船名 cosco development,航次 0042w,两辆 cayenne 的 vin 號都对上了。etd newark feb 17,也就是今天周三开的船,eta 天津港大概四周后。
陈一然赶紧转发给了王经理,然后给徐力说了一声。
徐力回了个搓手的表情。
他放下手机,有一搭没一搭地刷著人人网。
披萨到得很快,他一边吃一边继续高强度在人人上衝浪。
最近他已经成为了 eli 传奇,新生 3 周就去考托福考了个满分。天天不用上课,在家睡觉刷人人,到处回復閒得要死。
很多前世很熟悉的朋友,这辈子虽然不太熟了,但是在网上建立了联繫。
一个披萨吃完,还有点饿的陈一然乾脆开车去 acme 进行了一番採购。
茉莉的存在,让陈一然可以安心地暴饮暴食,反正大不了头枕冰块让茉莉疯狂运转一段时间。
本章未完,点击下一页继续阅读。