0 前言

作业1对应的试题

作业1对应的启动代码

作业1主页

1 Softmax(10分)

(a)(5分)

对于向量$x+c$的任一维度$i$,有:

\begin{align*}
\mbox{softmax(x + c)}_i &= \frac{e^{x_i + c}}{\sum_j e^{x_j + c}} \\
&= \frac{e^c e^{x_i}}{\sum_j e^c e^{x_j}} \\
&= \frac{e^c e^{x_i}}{e^c \sum_j e^{x_j}} \\
&= \frac{e^{x_i}}{\sum_j e^{x_j}} \\
&= \mbox{softmax(x)}_i
\end{align*}

(b)(5分)

向量和矩阵分开处理:

if len(x.shape) > 1:
# Matrix
### YOUR CODE HERE
x = x - np.max(x, 1).reshape(-1 ,1) # 每个元素都减去所在列对应的最大值
x_exp = np.exp(x)
x = x_exp / np.sum(x_exp, 1)
### END YOUR CODE
else:
# Vector
### YOUR CODE HERE
x = x - np.max(x)
x_exp = np.exp(x)
x = x_exp / np.sum(x_exp)
### END YOUR CODE

也可以参考完整代码

2 神经网络基础(30分)

(a)(3分)

\begin{align*}
\frac{\partial }{\partial x} \sigma(x) &= \frac{\partial \frac{1}{1+\exp(-x)}}{\partial (1+\exp(-x))}\cdot \frac{\partial (1+\exp(-x))}{\partial x} \\
&= -\frac{1}{(1+\exp(-x))^2} \cdot (-\exp(-x)) \\
&= \frac{1}{1+\exp(-x)} \cdot \frac{\exp(-x)}{1+\exp(-x)} \\
&= \sigma(x)(1-\sigma(x))
\end{align*}

(b)(3分)

题目中已经假设,$y$的第$k$维是1,其它维度都是0。首先求$\hat{y}_k$关于每一个$\theta_i$的偏导数。其中,

\begin{align*}
\hat{y}_k = \frac{\exp(\theta_k)}{\sum_j \exp(\theta_j)}
\end{align*}

当$i=k$时,

\begin{align*}
\frac{\partial \hat{y}_k}{\partial \theta_k} &= \frac{\partial }{\partial \theta_k} \frac{\exp(\theta_k)}{\sum_j \exp(\theta_i)} \\
&= \frac{\exp(\theta_k)(\sum_j \exp(\theta_i)) - \exp(\theta_k)\exp(\theta_k)}{(\sum_j \exp(\theta_i))^2} \\
&= \frac{\exp(\theta_k)}{\sum_j \exp(\theta_i)}(1 - \frac{\exp(\theta_k)}{\sum_j \exp(\theta_i)}) \\
&= \hat{y}_k(1 - \hat{y}_k)
\end{align*}

当$i \neq k$时,

\begin{align*}
\frac{\partial \hat{y}_k}{\partial \theta_i} &= \frac{\partial }{\partial \theta_i} \frac{\exp(\theta_k)}{\sum_j \exp(\theta_j)} \\
&= \frac{0 \cdot \sum_j \exp(\theta_j) - \exp(\theta_k)\exp(\theta_i)}{(\sum_j \exp(\theta_j))^2} \\
&= -\hat{y}_k\hat{y}_i
\end{align*}

对CE进行简化,

\begin{align*}
CE(y,\hat{y}) &= -\sum_iy_i\log(\hat{y}_i) \\
&=-\log(\hat{y}_k)
\end{align*}

\begin{align*}
\frac{\partial }{\partial \theta} CE(y,\hat{y}) = -\frac{\partial }{\partial \theta} \log(\hat{y}_k)
\end{align*}

当$i=k$时,

\begin{align*}
\frac{\partial }{\partial \theta_k} CE(y,\hat{y}) &= -\frac{\partial }{\partial \theta_k} \log(\hat{y}_k) \\
&= -\frac{1}{\hat{y}_k} \cdot \hat{y}_k(1 - \hat{y}_k) \\
&= \hat{y}_k - 1
\end{align*}

当$i \neq k$时,

\begin{align*}
\frac{\partial }{\partial \theta_i} CE(y,\hat{y}) &= -\frac{\partial }{\partial \theta_i} \log(\hat{y}_k) \\
&= -\frac{1}{\hat{y}_k} \cdot (-\hat{y}_k\hat{y}_i) \\
&= \hat{y}_i
\end{align*}

(c)(6分)

参考神经网络及其训练中的1.5,向后推导即可。不同的是,前文是求损失函数关于某个权重的偏导数,这里是求损失函数关于输入$x$的偏导数。

(d)(2分)

输入层到隐层需要权重$D_x \cdot H$个,偏置项$H$个。

隐层到输出层需要权重$D_y \cdot H$个,偏置项$D_y$个。

该神经网络参数总共个$D_x \cdot H + H + D_y \cdot H + D_y$。

(e)(4分)

参考代码

(f)(4分)

参考代码

(g)(8分)

参考代码

3 word2vec(40分)

(a)(3分)

与2(b)的证明类似,

\begin{align*}
CE(y,\hat{y}) &= -\sum_iy_i\log(\hat{y}_i) \\ &=-\log(\hat{y}_o)
\end{align*}

\begin{align*}
\frac{\partial }{\partial v_c} CE(y,\hat{y}) &= -\frac{\partial }{\partial v_c} \log(y_o) \\
&= -\frac{1}{y_o} \frac{\partial }{\partial v_c} \frac{\exp(u_o^Tv_c)}{\sum_{w=1}^{V}\exp(u_w^Tv_c)} \\
&= -\frac{1}{y_o} \frac{1}{(\sum_{w=1}^{V}\exp(u_w^Tv_c))^2} ((\sum_{w=1}^{V}\exp(u_w^Tv_c))\exp(u_o^Tv_c)u_o -\exp(u_o^Tv_c)\sum_{w=1}^V \exp(u_w^Tv_c)u_w) \\
&= -\frac{1}{y_o} \frac{\exp(u_o^Tv_c)}{(\sum_{w=1}^{V}\exp(u_w^Tv_c))^2} ((\sum_{w=1}^{V}\exp(u_w^Tv_c))u_o - \sum_{w=1}^V \exp(u_w^Tv_c)u_w) \\
&= - \frac{1}{\sum_{w=1}^{V}\exp(u_w^Tv_c)} ((\sum_{w=1}^{V}\exp(u_w^Tv_c))u_o - \sum_{w=1}^V \exp(u_w^Tv_c)u_w) \\
&= -(u_o - \frac{\sum_{w=1}^V \exp(u_w^Tv_c)u_w}{\sum_{w=1}^{V}\exp(u_w^Tv_c)}) \\
&= \frac{\sum_{w=1}^V \exp(u_w^Tv_c)u_w}{\sum_{w=1}^{V}\exp(u_w^Tv_c)} - u_o
\end{align*}

(b)(3分)

这一问跟2(b)更类似。

当$k = o$时,

\begin{align*}
\frac{\partial }{\partial u_k} CE(y,\hat{y}) &= -\frac{\partial }{\partial u_k} \log(y_o) \\
&= -\frac{1}{y_o} \frac{\partial }{\partial u_k} \frac{\exp(u_o^Tv_c)}{\sum_{w=1}^{V}\exp(u_w^Tv_c)} \\
&= -\frac{1}{y_o} \frac{1}{(\sum_{w=1}^{V}\exp(u_w^Tv_c))^2} ((\sum_{w=1}^{V}\exp(u_w^Tv_c))\exp(u_o^Tv_c)v_c - \exp(u_o^Tv_c)\exp(u_k^Tv_c)v_c) \\
&= -\frac{1}{\sum_{w=1}^{V}\exp(u_w^Tv_c)} ((\sum_{w=1}^{V}\exp(u_w^Tv_c))v_c - \exp(u_k^Tv_c)v_c) \\
&= -(v_c - \hat{y}_k v_c) \\
&= (\hat{y}_k - 1)v_c
\end{align*}

当$k \neq o$时,

\begin{align*}
\frac{\partial }{\partial u_k} CE(y,\hat{y}) &= -\frac{\partial }{\partial u_k} \log(y_o) \\
&= -\frac{1}{y_o} \frac{\partial }{\partial u_k} \frac{\exp(u_o^Tv_c)}{\sum_{w=1}^{V}\exp(u_w^Tv_c)} \\
&= -\frac{1}{y_o} \frac{1}{(\sum_{w=1}^{V}\exp(u_w^Tv_c))^2} (0 - \exp(u_o^Tv_c)\exp(u_k^Tv_c)v_c) \\
&= -\frac{1}{\sum_{w=1}^{V}\exp(u_w^Tv_c)} (- \exp(u_k^Tv_c)v_c) \\
&= \hat{y}_kv_c
\end{align*}

将两种情况合并起来,

\begin{align*}
\frac{\partial }{\partial u_k} CE(y,\hat{y}) = (\hat{y}_k - y_k)v_c
\end{align*}

(c) (3分)

用negative sampling损失函数改写3(b):

\begin{align*}
\frac{\partial }{\partial u_o} J_{neg-sample} &= -\frac{\partial }{\partial u_o} \log(\sigma(u_o^Tv_c)) \\
&= -\frac{1}{\sigma(u_o^Tv_c)} \frac{\partial }{\partial u_o} \sigma(u_o^Tv_c) \\
&= -\frac{1}{\sigma(u_o^Tv_c)} \sigma(u_o^Tv_c)(1-\sigma(u_o^Tv_c))v_c \\
&= (\sigma(u_o^Tv_c)-1)v_c
\end{align*}

\begin{align*}
\frac{\partial }{\partial u_k} J_{neg-sample} &= -\frac{\partial }{\partial u_k} \sum_{i=1}^{K}\log(\sigma(-u_i^Tv_c)) \\
&= -\frac{\partial }{\partial u_k} \log(\sigma(-u_k^Tv_c))  \\
&= -\frac{1}{\sigma(-u_k^Tv_c)} \frac{\partial }{\partial u_k} \sigma(-u_k^Tv_c) \\
&= (1 - \sigma(-u_k^Tv_c))v_c
\end{align*}

之前计算softmax损失函数时,需要计算整个词表的概率分布,时间复杂的是$O(V)$。而使用negative sampling损失,时间复杂度降为了$O(K)$。

用negative sampling损失函数改写3(a):

\begin{align*}
\frac{\partial }{\partial v_c} J_{neg-sample} &= -\frac{\partial }{\partial v_c}\{\log(\sigma(u_o^Tv_c)) + \sum_{i=1}^{K}\log(\sigma(-u_i^Tv_c))\} \\
&= (\sigma(u_o^Tv_c)-1)u_o + \sum_{i=1}^{K} (1 - \sigma(-u_i^Tv_c))u_i
\end{align*}

(d)(8分)

我只求一下Skip-Gram模型的导数吧,CBOW的不准备做了。

假设$u_{t+j}$是词$w_{t+j}$对应的输出词向量。

1、使用softmax损失函数,再根据3(a)、3(b)算得的结果:

\begin{align*}
\frac{\partial }{\partial v_c} J_{softmax}(w_{t-m \cdots t+m}) &= \frac{\partial }{\partial v_c} \sum_{-m \leq j \leq m, j \neq 0} F(w_{t+j}, v_c) \\
&= \sum_{-m \leq j \leq m, j \neq 0} (\frac{\sum_{w=1}^V \exp(u_w^Tv_c)u_w}{\sum_{w=1}^{V}\exp(u_w^Tv_c)} - u_{t+j}) \\
\end{align*}

\begin{align*}
\frac{\partial }{\partial u_{t+j}} CE(y,\hat{y}) = (\hat{y}_{t+j} - y_{t+j})v_c
\end{align*}

2、并使用negative sampling损失函数,再根据3(c)算得的结果:

\begin{align*}
\frac{\partial }{\partial v_c} J_{skip-gram}(w_{t-m \cdots t+m}) &= \frac{\partial }{\partial v_c} \sum_{-m \leq j \leq m, j \neq 0} F(w_{t+j}, v_c) \\
&= \frac{\partial }{\partial v_c} \sum_{-m \leq j \leq m, j \neq 0} \{ -\log(\sigma(u_{t+j}^T)v_c) - \sum_{i=1}^{K_{j}} \log(\sigma(-u_{ji}^Tv_c))\} \\
&= \sum_{-m \leq j \leq m, j \neq 0} \{ (\sigma(u_{t+j}^Tv_c)-1)u_{t+j} + \sum_{i=1}^{K_{j}} (1 - \sigma(-u_{ji}^Tv_c))u_{ji} \}
\end{align*}

其中,$u_{ji}$是为词$w_{t+j}$负抽样出的第$i$个负样本,$K_j$是词$w_{t+j}$负抽样的总词数。

$\frac{\partial }{\partial u_{t+j}} J_{skip-gram}(w_{t-m \cdots t+m})$、$\frac{\partial }{\partial u_{ji}} J_{skip-gram}(w_{t-m \cdots t+m})$与上题中,对3(b)的改写是一样的。

(e)(12分)

我实现了Skip-Gram模型,没有去实现CBOW。参考代码

(f)(4分)

参考代码

(g)(4分)

该题不需要写额外的代码,下载数据之后,运行q3 run.py即可训练词向量,最后生成如下的可视化图像:

4 情感分析(20分)

a(2分)

参考代码

b(1分)

对机器学习任务引入正则项,是为了防止过拟合。如果不用正则项,会导致在训练集上面效果很好,模型自由度过高,充分拟合了训练集数据(包括噪声)。却无法一般化,推广到测试集,导致测试集效果很差。

c(2分)

虽然题目乍一看有点复杂,不过从分值就可以看出,该题的解答代码很简单。参考代码

d(3分)

预训练的GloVe在测试集达到了 37.96%的正确率(正则项系数$10^3$),而使用我自己训练的词向量正确率只有29.86%。我想这是因为:

1、GloVe的训练语料(Wikipedia data)要大得多

2、我的模型训练时,基本又有进行参数的调优。比如,词向量维度只有10,而GloVe词向量的维度至少是50

3、GloVe模型本身就要优于word2vec

e(4分)

从图中可以看出,随着正则项系数的增大,训练集的正确率总体上是震荡下降的。而开发集(dev)有一个先缓慢上升然后下降的过程,并在$10^{3}$附近达到最大。

f(4分)

从图中可以看出,“-”预测为“+”、“+”预测为“-”这种严重的错误还是挺多的。甚至有两个“--”被预测为“++”的案例。

g(4分)

先来看两个“--”被预测为“++”的案例:

  1. “dull , lifeless , and amateurishly assembled .”这基本都是负面词汇,这不知道为什么预测得这么离谱。难道是标点符号所占比例太大导致的?
  2. “a lackluster , unessential sequel to the classic disney adaptation of j.m. barrie 's peter pan .”这句话出错情有可原吧,毕竟逻辑回归没那么智能。人类一眼就能看出,关键词是前两个形容词lackluster和unessential,及其负面。但无奈的是,后面跟真实情感无关的一些词比较正面,比如classic。

然后是“+”被预测为“--”的案例:

“chilling but uncommercial look into the mind of jeffrey dahmer , serial killer” 转折之后是重点,可以逻辑回归算法不知道这个常识。

CS224n-作业1的更多相关文章

  1. 斯坦福CS224n课程作业

    斯坦福CS224n作业一 softmax 作业要求如下: 解析:题目要求我们证明\(softmax\)函数具有常数不变性. 解答:对于\(x+c\)的每一维来说,有如下等式成立: \[softmax( ...

  2. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  3. SQLServer2005创建定时作业任务

    SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...

  4. 使用T-SQL找出执行时间过长的作业

        有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下:   SELECT sj.name , ...

  5. T-SQL检查停止的复制作业代理,并启动

        有时候搭建的复制在作业比较多的时候,会因为某些情况导致代理停止或出错,如果分发代理时间停止稍微过长可能导致复制延期,从而需要从新初始化复制,带来问题.因此我写了一个脚本定期检查处于停止状态的分 ...

  6. Python09作业思路及源码:高级FTP服务器开发(仅供参考)

    高级FTP服务器开发 一,作业要求 高级FTP服务器开发 用户加密认证(完成) 多用户同时登陆(完成) 每个用户有不同家目录且只能访问自己的家目录(完成) 对用户进行磁盘配额,不同用户配额可不同(完成 ...

  7. 个人作业week3——代码复审

    1.     软件工程师的成长 感想 看了这么多博客,收获颇丰.一方面是对大牛们的计算机之路有了一定的了解,另一方面还是态度最重要,或者说用不用功最重要.这些博客里好些都是九几年或者零几年就开始学习编 ...

  8. 个人作业-week2:关于微软必应词典的案例分析

    第一部分 调研,评测 评测基于微软必应词典Android5.2.2客户端,手机型号为MI NOTE LTE,Android版本为6.0.1. 软件bug:关于这方面,其实有一些疑问.因为相对于市面上其 ...

  9. 软件工程第二次作业——git的使用

    1. 参照 http://www.cnblogs.com/xinz/p/3803109.html 的第一题,每人建立一个GitHub账号,组长建立一个Project,将本组成员纳入此Porject中的 ...

  10. hadoop作业调度策略

    一个Mapreduce作业是通过JobClient向master的JobTasker提交的(JobTasker一直在等待JobClient通过RPC协议提交作业),JobTasker接到JobClie ...

随机推荐

  1. Sequelize-nodejs-13-Working with legacy tables

    Working with legacy tables使用遗留表 While out of the box Sequelize will seem a bit opinionated it's triv ...

  2. Metapackage包

    Metapackage(功能包集)是把一些相近的功能模块. 软件包放到一起. ROS里常见的Metapacakge有: 2.Metapackage写法 CMakeLists.txt 写法如下: cma ...

  3. gulp插件 run-sequence(同步执行任务)

    功能描述 gulp默认使用最大并发数执行任务,也就是说所有的任务几乎都是同时执行,而不会等待其它任务.但很多时候,任务是需要有先后次序的,比如要先清理目标目录,然后再执行打包. run-sequenc ...

  4. SQL AND & OR 运算符

    AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤. AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 假设第一个条件和第二个条件都成立,则 ...

  5. 电商 APP 下单页(俗称车2) 业务流程概要设计

    购物车是电商APP的一个关键功能点,一般购物车包含 3-4 个页面,分别是: 1.购物车的商品列表页 2.商品下单页 3.订单付款页面 4.订单付款成功页面 由于现有购物车逻辑相对混乱,这里重新整理一 ...

  6. 【OC底层】Category、+load方法、+initialize方法原理

    Category原理 - Category编译之后的底层结构是 struct categroy_t,里面存储着分类对象方法.属性.协议信息- 当程序运行时,通过runtime动态的将分类的方法.属性. ...

  7. MySQL学习【第十篇存储引擎实际应用】

    一.将现有的myiasm引擎转化为innodb引擎 1.首先我们知道myisam有几点特别烦 a( 运用的是表级锁 b( 不支持csr(故障自动恢复) 2.mysql的5.1.177版本innodb引 ...

  8. localStorage 和 sessionStorage

    1.概述 以前本地存储使用 cookie.但是 Web 存储需要更加安全和快速.所以就出现了localStorage 和 sessionStorage. 2.sessionStorage,localS ...

  9. day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  10. Go压缩文件

    Go压缩文件 首先是恭喜IG获得S8全球总决赛冠军,IG牛逼.但咱是一介草民,狂欢后,还是得老老实实的开始敲代码.最近做了一个给底层固件压缩加密的工具,是使用C#做的,已经提交出去可以正常使用的.既然 ...