My solution
1.softmax
(a)sotfmax的性质
容易证明该性质。
Note指出,这个性质可以应用于计算softmax函数的值。这样手动把最大值调整成了0,避免了上溢出,而即使产生下溢出,也是下溢出到零,不会太损失精度。
(b)softmax的计算
Note指出numpy的向量化计算比较快,所以尽量少用for循环。numpy向量化运算相比循环,跳转逻辑更少,更容易并行,也更容易使用显卡算力,计算更快。
另外,代码要注意numpy库中的维度设定,运算的时候要时刻注意维度。
2.Neural Network Basics
(a)sigmoid的导数
文章图片
σ′(x)=?(1+e?x)′(1+e?x)2=e?x(1+e?x)2=σ(x)(1?σ(x))
(b)交叉熵函数的导数
?CE?θ=?(?log(y^k))?θ=?1y^k?y^k?θ
对下标分别标量求导
?y^k?θk=(eθk)′∑ieθi?eθk(∑ieθi)′(∑ieθi)2=eθk∑ieθi?eθkeθk(∑ieθi)2=y^k(1?y^k)?y^k?θj=(eθk)′∑ieθi?eθk(∑ieθi)′(∑ieθi)2=?eθkeθj(∑ieθi)2=?y^ky^j(j≠k)
合并下标
?y^k?θ=(1(k=j)y^k?y^ky^j)j=y^k(y?y^)
代入整理得
?CE?θ=y^?y
(c)(d)BP in Neural Network
文章图片
注意输入是行向量,求导的时候要时刻注意维度。
首先解答(d),同时把维度搞清楚,设|minibatch|=M:
x∈RM×Dx,W1∈RDx×H,b1∈RHh∈RM×H,W2∈RH×Dy,b2∈RDy,y^∈RM×Dy
中间对 bi 的加法用了一次复制,也就是说,实际加的是 bi1TM 矩阵
parament=[W1,b1,W2,b2]|parament|=(Dx+1)H+(H+1)Dy
清楚了维度,可以利用链式法则和维度调整方法解答(c):
定义 z2=hW2+b21TM
首先认为对minibatch的每个输入都有交叉熵 Jm ,定义 J=1TM(Jm) ,即损失函数简单地定义为总交叉熵,如果交叉熵损失函数定义为所有交叉熵的平均值,那么下面的所有导数都要除以M。
则 ?J?z2=1M?(Jm)m?z2=y^?y
?J?W2=hT(y^?y)?J?b2=1TM(y^?y)=sum((y^?y),dim=0)
定义 z1=hW1+b11TM
?J?z1=(y^?y)WT2?σ′(z1)=(y^?y)WT2?(h?(1?h))
?J?W1=hT(y^?y)WT2?(h?(1?h))?J?b1=1TM(y^?y)WT2?(h?(1?h))=sum((y^?y)WT2?(h?(1?h)),dim=0)
(e)(f)(g)Neural Network代码实现
(e)比较容易。
有了上面的公式,(g)实现起来也比较容易。
注意(g)中检查导数的方法是,把参数全部压成一维,传入(f)中的检查函数。
(f)为偏导数检查的函数,需要注意一些细节,数值估计某个维度偏导数的代码如下:
x0 = x[ix]
x[ix] += h
random.setstate(rndstate)
new_f1 = f(x)[0]
x[ix] -= 2*h
random.setstate(rndstate)
new_f2 = f(x)[0]
x[ix] = x0
numgrad = (new_f1 - new_f2) / (2 * h)
【Machine|My solution to cs224n assignment1(1-2)】1)f只能把x格式的一维向量当作输入,所以要修改x某一个维度的值,只能在原值上修改,最好不要复制一个x浪费空间。
2)为了不修改x的值,最后记得改回去,改回去最好不要用加了h,减了2h,就再加h来获得原值(虽然网上所有人都是这么做的),最好用一个额外变量记录,因为浮点数误差问题,x0+h-2h+h不等于x0。虽然误差很小,但是原则上说,代码的检查函数应该保存了检查导数前的x0,检查导数后为了确定没有修改原来的函数参数,应该assert(x==x0)。
3)调用前记得初始化随机数种子
4)泰勒展开知 f(x+h)?f(x?h)2h=f′(x)+o(h) ,而 f(x+h)?f(x)h=f′(x)+f′′(x)2h+o(h) ,前者更精确。
推荐阅读
- Machine|scikit-learn-分类模型评价标准
- machine|LightGBM参数介绍
- machine|【机器学习-西瓜书】二、性能度量(召回率;P-R曲线;F1值;ROC;AUC)
- Machine|基于HMM的中文分词
- Machine|机器学习分类结果混淆矩阵 TP、TN、FP、FN 防混淆基于方法
- java|fasttext 加载模型 内存分配失败
- Virtual|安装 VMware Tools 时报 客户机操作系统已将 CD-ROM 门锁定,并且可能正在使用CD-ROM--解决方案(简单粗暴)
- GC|深入理解JVM底层实现_2 对象结构、指针引用和垃圾回收机制
- Machine|OpenCV中Canny边缘检测
- Machine|Gabor滤波器与特征提取