CS224n_Assignment_1

assignment1/index.html 第一次作业笔记,对应代码使用Jupyter实现参考链接

Softmax

softmax常数不变性

softmax(xi)=exijexjsoftmax(xi)=exijexj(softmax(x+c))i=exi+cjexj+c=exi×ecec×jexj=exi×ecec×jexj=(softmax(x))i(softmax(x+c))i=exi+cjexj+c=exi×ecec×jexj=exi×ecec×jexj=(softmax(x))i

由于ex+y=exeyex+y=exey,因此多余的ecec可以上下消除,于是:
这里

softmax(x)=softmax(x+c)softmax(x)=softmax(x+c)

发现了一个Softmax非常好的性质,即使两个数都很大比如 10001001,其结果与 12的结果相同,即其只关注数字之间的差,而不是差占的比例。

实现

之所以介绍Softmax常数不变性,是因为发现给定的测试用例非常大,直接计算exex次方会比较不可行。

Python实现代码

神经网络基础

梯度检查

Python实现

这里的random.setstate(rndstate)非常重要,因为后续会用到,主要部分为:

1
2
3
4
5
6
7
8
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] += h
numgrad = (new_f1 - new_f2) / (2 * h)

Sigmoid导数

定义σ(x)σ(x)如下,发现σ(x)+σ(x)=1σ(x)+σ(x)=1

σ(x)=11+ex=exex+1σ(x)=11+ex=ex+1ex+1exex+1=1σ(x)σ(x)=11+ex=exex+1σ(x)=11+ex=ex+1ex+1exex+1=1σ(x)
  • sigmoid实现 sigmoid(x)=11+e(x)sigmoid(x)=11+e(x)

即: σ=σ(x)×(1σ(x))σ=σ(x)×(1σ(x))

交叉熵定义

当使用交叉熵作为评价指标时,求梯度:

  • 已知: ˆy=softmax(θ)^y=softmax(θ)
  • 交叉熵: CE(y,ˆy)=iyi×log(^yi)CE(y,^y)=iyi×log(^yi)

其中yy是指示变量,如果该类别和样本的类别相同就是1,否则就是0。因为y一般为one-hot类型。

^yi 表示每种类型的概率,概率已经过softmax计算。

对于交叉熵其实有多重定义的方式,但含义相同:

分别为:

二分类定义

J=[ylog(p)+(1y)log(1p)]
  • y——表示样本的label,正类为1,负类为0
  • p——表示样本预测为正的概率

多分类定义

J=Mc=1yclog(pc)
  • y——指示变量(0或1),如果该类别和样本的类别相同就是1,否则是0;
  • p——对于观测样本属于类别c的预测概率。

但表示的意思都相同,交叉熵用于反映 分类正确时的概率情况

Softmax导数

进入解答:

  • 首先定义Si和分子分母。
Si=softmax(θ)=figi=eθikk=1eθk
  • Siθj求导:

    Siθj=figifigigi=(eθi)kk=1eθkeθi(kk=1eθk)(kk=1eθk)2

注意: Si分子是θi ,分母是所有的θ ,而求偏微的是θj

  • 因此,根据i与j的关系,分为两种情况:
  • i==j 时:

    fi=eθi,gi=eθjSiθj=eθikk=1eθkeθieθj(kk=1eθk)2=eθikeθk×keθkeθjkeθk=Si×(1Si)
  • ij 时:

    fi=0,gi=eθjSiθj=0eθjeθi(keθk)2=eθjθkk×eθikeθk=Sj×Si

交叉熵梯度

计算CEθi ,根据链式法则,CEθi=CESiSiθj

  • ˆy=softmax(θ)
  • CE(y,ˆy)=kyklog(^yk)CEθi=kyklogSkθi=kyk1SkSkθi=yi(1Si)kiyk1Sk(Sk×Si)=yi(1Si)+kiykSi=Si(kyk)yi

因为kyk=1,所以CEθi=Siyi=ˆyy

反向传播计算神经网络梯度

根据题目给定的定义:

已知损失函数J=CEh=sigmoid(xW1+b1), ˆy=softmax(hW2+b2)

Jx,JW2,JW1,Jb2,Jb1

解答:

反向传播,定义z2=hW2+b2z1=xW1+b1

对于输出层ˆy来说,ˆy的输入为 z2=hW2+b2,而输出则为 ˆy=softmax(z2)

上小节计算得到 CE(y,ˆy)=kyklog(^yk) 的梯度为 CEθi=ˆyy,

可以使用 z2 替代 θi ,得到

  • δ1=CEz2=ˆyy

  • δ2=CEh=CEz2z2h=δ1WT2

  • δ3=CEz1=CEhhz1=δ2hz1=δ2σ(z1) # 推测这里使用点乘的原因是δ2经过计算后,应该是一个标量,而不是向量。

  • 于是得到:CEx=δ3z1x=δ3WT1

与计算CEx相似,计算

  • CEW2=CEz2z2W2=δ1h
  • CEb2=CEz2z2b2=δ1
  • CEW1=CEz1z1W1=δ3x
  • CEb1=CEz1z1b1=δ3

参数数量

nW1=Dx×Hnb1=HnW2=H×Dynb2=DyN=(Dx×H)+H+(H×Dy)+Dy=(Dx+1)×H+(H+1)×Dy

代码实现

如果仍然对反向传播有疑惑

word2vec

关于词向量的梯度

在以softmax为假设函数的word2vec中

vc是中央单词的词向量

uw (w=1,,W) 是第 w个词语的词向量。

假设使用交叉熵作为损失函数, o 为正确单词 (one-hot向量的第 o维为1),请推导损失函数关于vc的梯度。

提示:

JsoftmaxCE(o,vc,U)=CE(y,ˆy)

其中U=[u1,u1,,uW]是所有词向量构成的矩阵。

解答:

首先明确本题给定的模型是skip-gram ,通过给定中心词,来发现周围词的。

定义z=UTvcU 表示所有词向量组成的矩阵,而vc 也表示的是一个词向量。

hint: 如果两个向量相似性越高,则乘积也就越大。想象一下余弦夹角,应该比较好明白。

因为U中所有的词向量,都和vc乘一下获得z

z是干嘛用的呢? z内就有W个值,每个值表示和vc 相似程度,通过这个相似度softmax选出最大值,然后与实际对比,进行交叉熵的计算。

已知: zvc=UJz=(ˆyy)

因此:Jvc=Jzzvc=U(ˆyy)


除了上述表示之外,还有另一种计算方法

于是: Jvc=ui+Ww=1^ywuw

仔细观察这两种写法,会发现其实是一回事,都是 观察与期望的差(ˆyy)。

推导lookup-table梯度

与词向量相似

JU=JzzU=vc(ˆyy)T

代码实现

softmaxCostAndGradient

负采样时的梯度推导

假设进行负采样,样本数为K,正确答案为o,那么有o1,,K。负采样损失函数定义如下:

其中:

σ(x)=11+ex=ex1+exxσ(x)=σ(x)×(1σ(x))

解答:

首先说明一下,Jnegsample从哪里来的,参考note1 第11页,会有一个非常详细的解释。

Jvc=(σ(uTovc)1)uoKk=1(σ(uTkvc)1)ukJuo=(σ(uTovc)1)vcJuk=(σ(uTkvc)1)vc

代码实现

negSamplingCostAndGradient

全部梯度

推导窗口半径m的上下文[wordcm,...,wordc1,wordc,wordc+1,...,wordc+m]时,skip-gram 和 CBOW的损失函数F(o,vc) (o 是正确答案的词向量)或说JsoftmaxCE(o,vc,)Jnegsample(o,vc,) 关于每个词向量的梯度。

对于skip-gram来讲,c的上下文对应的损失函数是:

Jskipgram(wordcmc+m)=mjm,j0F(wc+j,vc)

这里 wc+j 是离中心词距离j的那个单词。

而CBOW稍有不同,不使用中心词vc而使用上下文词向量的和ˆv作为输入去预测中心词:

ˆv=mjm,j0vc+j

然后CBOW的损失函数是:

JCBOW(wordcmc+m)=F(wc,ˆv)

解答:

根据前面的推导,知道如何得到梯度

Jvc=UT(ˆyy)

JU=vc(ˆyy)T

那么所求的梯度可以写作:

skip-gram

Jskipgram(wordcmc+m)U=mjm,j0F(wc+j,vc)UJskipgram(wordcmc+m)vc=mjm,j0F(wc+j,vc)vcJskipgram(wordcmc+m)vj=0,jc

CBOW

JCBOW(wordcmc+m)U=F(wc,ˆv)UJCBOW(wordcmc+m)vj=F(wc,ˆv)ˆv,(jc){cmc+m}JCBOW(wordcmc+m)vj=0,(jc){cmc+m}

代码实现

补充部分

  • 矩阵的每个行向量的长度归一化

    1
    x = x/np.linalg.norm(x,axis=1,keepdims=True)
  • 在斯坦福情感树库上训练词向量

    直接运行q3_run即可

情感分析

特征向量

最简单的特征选择方法就是取所有词向量的平均

1
2
3
4
5
sentence_index = [tokens[i] for i in sentence]
for index in sentence_index:
sentVector += wordVectors[index, :]

sentVector /= len(sentence)

正则化

1
values = np.logspace(-4, 2, num=100, base=10)

调参

1
bestResult = max(results, key= lambda x: x['dev'])

惩罚因子对效果的影响

confusion matrix

关联性排序的一个东西,对角线上的元素越多,预测越准确。

代码参考

q4_sentiment.ipynb

作者

mmmwhy

发布于

2019-05-02

更新于

2022-11-29

许可协议

评论

未找到相关的 Issues 进行评论

请联系 @mmmwhy 初始化创建