ECNU 2019 NLP Spring_Seminar 第一讲 introduction&regression

开个博客记录一下ECNU NLP研讨班的内容。课件是李宏毅的机器学习课件。

课件链接:

http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17_2.html

博客中只记录我认为研讨课上有价值的东西。具体课程内容请参考上述链接。

人工智能——机器学习——深度学习

一直以来都是把回归任务当作连续问题,分类问题当作离散问题来记忆。然而今天对于这个概念理解得更加深刻了。我们的模型实际上在做一个怎样的事情呢?是构造一个函数,建立x到y的映射。这里,回归问题也就是y的值域是连续值的情况,而分类问题就是y的值域是离散值。二者都是在函数映射这个大框架下的。

structured learning: 结构化学习。例如机器翻译任务。将定义域对齐到值域上。这个对齐是有内部(词)的结构关系在其中的,而不是上述说的简单的到y的映射。

模型,损失函数,梯度下降的定义,老生常谈了,不多说,看ppt.这里一个细节是梯度下降时w和b的更新是同步的,也就是w1是根据w0和b0更新,然后进行b1的更新时也是根据w0和b0,而不是刚刚更新好的w1. 另外实际代码上的梯度下降不一定是要到0的时候才停止更新,因为很多时候会更新太慢。

过拟合:尽管训练和测试样本是同分布的,但是数据的不够是会导致拟合。那么怎么避免?1. 奥卡姆剃刀。尽量选择简单的函数;2. 重新设计模型,比如先对x的类别进行分类,对于每一类用不同的权重wi。3. 正则化。对于权重w,将其放在损失函数中,以|w|放入则是L1正则,(w)平方则是L2正则。直观上来说,就是要让w尽可能地小,因为w越小,出现过拟合时曲线突然很陡的情况也就越少,曲线也就越平坦。

对于奥卡姆剃刀,模型越复杂,越过拟合的现象在数学上是可以证明的。但是这一点只针对传统机器学习!对于深度学习来说,这一套却不适用。也就是说可能模型越复杂越好。

对于正则化来说,可以尝试给更高次的x对应的w赋予更高的权重。同时最后讨论了一个很有趣的问题:为什么L1正则化(使用绝对值的)优化结果中,很多w都是0,而L2正则化的优化结果中,很多w都是趋向于0但是不等于0. 这里讨论了几种理解:1. 通过两者曲线的相切。这个没听懂,先把坑放在这里了。。。2. L1正则w=0,说明这是极值点,而L1在x=0时不可导,因此需要导数两边异号,也就是乘积小于0来满足这个条件;而L1的式子如果想满足这个条件很简单,只需要L<L1正则的系数lamda即可。而L2要达到这个条件必须要让L=0,这很难做到。所以L2最后优化的结果很难直接等于0; 3. 从导数上直观理解,L1中正则项的导数要么为1要么为-1,也就是说w的减小不会使得梯度下降变慢,直到等于0为止;而L2的正则项求导后为2w,也就是w越小,下降的越慢,最后也就趋于不下降。

在互联网裸奔

最近在看观点挖掘(opinion mining)方向的东西,然后今天打开知乎发现,第一篇推荐就是一篇这方面paper的笔记。。。然而在我的印象中,我好像从来没有在知乎上搜索过这方面的东西。淘宝啥的窃听用户我还能够理解,知乎如果也用这一套的话,真的是挺可怕的,互联网公司真的有那么注意保护人权和隐私吗?恐怕不是。上了大学以后铺天盖地的垃圾短信就很好地说明了部分资本对隐私的态度——你不知道你的隐私是我透露的,那么我就可以拿去牟利。有预感国内的互联网公司的数据隐私问题一定会随着某一个大公司丑闻的揭露而爆发。

个人认为,在道德问题上,个性化推荐不应该去碰用户隐私这条红线。

CTF划水记

第一次参加了CTF(夺旗赛,有点像网络安全领域里的ACM)。因为是在我们学校举办的,报名的时候也就抱着划划水的态度,没有准备和了解的情况下就做了(这样很不好) 。虽然只A了几道签到题,但好歹是这个方向的第一次尝试,感觉也挺有意思的,所以回忆了一下做了的几道题目。因为比赛结束网站已经进不去了,所以题目就简单描述一下,主要是记录一下自己当时的思维过程。

1.SQL注入

sql注入是信息安全竞赛很常见的题目,据我看了几条blog的浅薄经验来说,关键是用户输入的文本需要由后端通过字符串拼接成SQL语句,这里字符串的拼接就可以做文章。本题网页需要用户在文本框中输入1或者2,然后网页会return查询结果。那么首先,我们要确认后端sql语句的类别——因为可能是select * from table where gid = 1 或者 select * from table where gid = ‘1’ 或者 select * from table where (gid = 1) 或者
select * from table where (gid = ‘1’ ) 几种情况。这里首先在return 的url的gid = 1后加上’,网页报错,然后再在gid = 1’后加上%23,即#号(为什么不直接用#是因为浏览器有特殊的机制过滤#),网页正常return,说明需要闭合单引号,即后端的sql语句形式是 select * from table where gid = ‘1’ .

再判断注入的行数。使用order by,发现order by 5时,无回显,order by 4时有回显,所以后端返回列数为4.再使用 gid=0’ union 1,2,3,4# 返回顺序如下图:

再查找当前数据库名,当前用户名以及当前sql版本号:
gid=0’ union 1,database(),user(),version() #,结果如下 :


再查找当前数据库的所有表名:
gid=0′ union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=database())# :

注入出flag表的列名 :
gid=0′ union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_name=’flag’)#
直接找到列名为flag的列return结果 :
gid=0′ union select 1,2,3,(select flag from flag)%23

2.BASE64+JSFUCK

给定一串字符串需要解密;这里是一串长字符串,我看了一下,由大写字母和数字组成,然后呈现高度重复的状态,但不是完全重复;因此我猜测这是某一种二次加密。如果是一次加密的话,难以出现只由部分字符(大写字母,数字)形成的高度重复的字符串。查找了一下相应的密码学算法,发现常用的长串字符串编码有:base64, base32, base16, brainfuck, jsfuck等; 其中它们都有各自的字符串组成要求: base64
可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符; base32可打印字符
大写字母(A-Z)和数字234567 ;brainfuck和jsfuck的字符都有高度的重复性,但是只由<>+[]等特定字符组成。因此大概率猜测所给字符串是base64编码的,丢到在线base64解密网站中发现,得到一串明显是Jsfuck编码后的字符串,果不其然,再进行jsfuck解密,得到flag.

3.变异凯撒

凯撒密码:

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。现今又叫“移位密码”,只不过移动的位数不一定是3位而已。
下面我们总结一下:
明密对照表:
明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文:TUVWXYZABCDEFGHIJKLMNOPQRS
注:广义上的凯撒是位移的。

这里页面是给了一串字符串:bg[‘sZ*Zg’dPfP’VM_SXVd 同时页面还给了一个tip:flag的格式为flag{} 短字符串的常见加密算法有:凯撒密码,栅栏密码,摩斯密码,ASCII编码,培根密码等。因为没有给栅栏数的提示,不可能是栅栏,同时显然不可能是摩斯,因此先尝试凯撒密码,根据tip,发现b和flag中的f的ASCII码差4位,g与l差5位,[与a差6位,’与g差7位。因此这个规律就很显然了:差逐个递增的变异凯撒密码。编写简单的python得到结果。 做这个题让我感觉回到了高中数学找规律的时候。。有点亲切

4.计算

这个题是随机生成一串十六进制下的算数表达式,让我们在2秒内return一个正确的结果。显然需要自己get request再post回去,不多说直接上代码和结果:

看到官方给出了wp,所以再更新一下其它几道题的思路吧。。。(虽然很多工具都没听过也不懂)

5. base64解密15次即可。15次后解密再用栅栏密码,每组字符数5,进行解密。这题我是试了,但是用写的脚本进行base64多轮解却没结果?不知道为什么。

6. 确实是题目所说的希尔,但是要把密文转变成1-26,并形成矩阵a;再常规解密即可得flag。

7. 下载图片使用binwakl分析,发现zip压缩包,使用binwalk -e进行分离,根据提示是用QQ号加密,于是使用ARPCHPR Professional Edition爆破5-11位数字得到结果。

8. 进入赛题看到rsa256;openssl处理公钥文件,得到e,n;再因式分解

9. 查壳是无壳32位ELF文件,拖进ida直接看(我也不知道是啥),找到一个函数:sub_8048580。在该函数内的while循环每次进行过程中,都会调用memset函数栈区初始化,即每次while循环过程中,只有这次循环的起作用,其余的不起作用。经过思考,可以倒推这个符合条件的字符串;

10. 考点md5碰撞。使用fastcoll_v1.0.0.5 进行碰撞值获取,将获取的值二进制

11. 该题有两个password。首先查壳,是一个使用GCC编译的程序,没有加壳;放进IDA找可行字符串,找到了一个“You passed level1!”;找到引用该字符串的地方,顺利找到第一个password使用OD,动态调试一下第一个password的流程;找到程序在判断第一个password是否正确前,使用RtlAddVectoredExceptionHandler函数注册了一个异常处理函数,并第一个参数为1,表示出现异常后第一个使用这个注册的异常处理函数来处理,第二个参数就是异常处理函数的地址。异常处理函数中,在对比两个数值之后有一个字符串的输出,判读啊你应该是对比了第二个password之后输出提示字符串。

12. 观察URL /index.php?id===QM,==QM是1经base64转码后逆序;经fuzzing测试,发现过滤了空格,=,and,or,union,select等。其中and,or,union,select为单次过滤,使用anandd,oorr,ununionion,seleselectct可以绕过,=可使用like 替换;编写脚本后手注即可;

13. cms漏洞,连菜刀,根目录下找flag

14. 查看源码,发现index。phps文件,下载后进行分析;从代码中可以看到要求POST请求提交name和password。name和password的值不能相同,但是二者的sha1加密要求相同。post提交name[]=1&password[]=2得到flag。

另外有一道题目做到一半放弃了(一道音频题,用软件处理以后已经拿到了flag,但是答案不对,应该是需要再进一步处理,可是试了好久没试出来。注:现在搞清楚了。。。音频属性描述里有三个零,以此开脑洞把三个下划线换成三个0再MD解密),感觉找到了当年水程序设计竞赛时的感受。。不过个人觉得,信息竞赛还是比ACM要有意思的,也更有成就感,同时对码力一般的选手比较友好(所以码力一般我为啥要转到计算机来。。。),不过想打好比赛也需要刻苦的训练,而不是我这样裸考就可以的。如果大一大二的时候就接触了这个的话,我可能会入坑吧。不管怎么说,花了一天时间,了解了一些信息安全方面的东西,还是挺有意思也挺有价值的。希望自己在今年的事情忙完之后还能够有时间回来这个坑。

[EMNLP2017] Large-scale Opinion Relation Extraction with Distantly Supervised Neural Network

原文链接:http://aclweb.org/anthology/E17-1097

摘要:作者调查了开放域观点关系抽取的任务。给定一堆无标记的文本,作者提出一种高效的基于模式匹配和神经网络分类器的远监督框架。pattern用来自动生成训练数据,深度学习模型用来捕捉各种词汇和语法特征。算法的结果在大范围语料库中是快速且可扩展的。作者在亚马逊在线评论数据集上进行了测试,测试结果表明提出的模型在没有人类标注的情况下可以达到一个很有前景的性能。

1. Introduction

观点抽取系统:从文本中侦测并抽取观点相关的信息。

观点关系抽取任务:识别观点表达式(表明情绪,情感的词),观点目标(objects of opinions)和它们的关系(什么观点对哪一个目标)。

e.g.

The unit is [well designed] and [perfect reception]. 

The Passion of The Christ will [touch your heart]. 

这两个句子中的观点关系有:

(“well designed”,”unit”), (“perfect reception”,”unit”)

    (“touch your heart”, “The Passion of The Christ”)

观点关系的抽取常常是细粒度观点分析的第一步,并且在其它情感相关的应用中扮演着重要的角色。这篇文章的目的是从开放域大范围观点文本中抽取观点关系对。

现在已有方法的问题:

  • 有监督:性能好,但获得大量标注数据困难,模型只能在固定领域使用。
  • 基于模式:简单快速,scalable,但是对语法错误敏感,噪声难以控制(bootstrapping),且覆盖率低。
  • 同时,现在的方法过于依赖观点词典,对多个词组成的表达式支持不好(例如,“more than what I expected”,“honest to the book”,“adrenaline pumping”)。另一个问题是一些正确的表达式可能因为POS tagger和syntactic parsers产生的错误而被忽略。

主要贡献:

  • 提出了一个远监督算法来进行开放域的观点关系抽取。
  • 开发了一个神经网络模型来学习词法和语法上下文的表示。模型用双向LSTM来捕捉整体信息,CNN捕捉局部低维特征信息。
  • 探索了一个无监督的分类器来侦测多个词的观点表达式。给定一个表达式,分类器去判断相邻的词是否是一个观点表达式。

系统在亚马逊评论数据集上测试,包括15个不同的领域和3300万条评论。输出的数据库包括72500w观点关系对。

2. Related Works

几个方面

  • 观点关系抽取
  1. 有监督:pipeline(先抽观点表达式和目标的候选,再识别对应的关系);joint
  2. 半监督,无监督:rule-based bootstrapping, graph propagation, integer   programming, probabilistic topic model
  • 远监督算法
  • aspect-based opinion mining (目标常限制在预先定义的集合中,而我们的系统可以处理开放域问题)

3. The Approach

input: s = w1,w2,…,wn

output: (O, T) pairs,

其中O = wi, wi+1,…, wj(opinion expression)  T = wk, wk+1, …, wl (opinion target)

3.1 Patterns

syntactic pattern:

优点:fast;across  domain

        缺点:语法树有噪声;覆盖率不高

解决方案:

问题一: 给语法树强约束来保证输出的质量

      问题二: 使用远监督分类器和观点表达式分类器来提高覆盖率

所用pattern: 

如何克服噪声问题:使用预先定义的POStag sets 和观点词典

多词表达式问题:当两个词满足一个pattern时,用最小的包含它们的短语来扩充它们。同时,一个关系对可以被编译成新的观点表达式,比如(“perfectly”,“fit”)和(“fit perfectly”,“the case”)

作者同时还调查了bootstrapping方法,并指出与找到的新观点词相比,这个方法引入的noise太多,得不偿失。

3.2 Distant Supervision

解决覆盖率不够的问题。实际上,就是构建了一个分类器,来帮助判断(O, T)是否是一个有效的观点关系。训练集通过模式匹配生成,这里假设这些生成的关系都是正确的。

从传统的(非深度学习的)关系分类器中获得灵感,作者的分类器显式地学习不同的词法和语法上下文表示,模型结构如下图所示

3.3 Opinion Expression Classifier

上述算法中,候选的观点表达式被抽取出来如果它包含至少一个观点词在观点词典L中。尽管如此,仍然有一些观点表达时被忽略,因为它们可能没有观点词,又或者它们的POS tags是错的。在这个section中,作者介绍了无监督的观点表达式分类器,根据上下文来预测是否一个短语是观点表达式。这个模型用的是CNN,窗口大小是5.  训练集通过词典L来生成,假设语料库中包含L的词的context都是positive的。负样本随机取。

4. Experiments

亚马逊产品评论语料库,包括15个领域和3300w条评论。


总结:工作思路还是挺清楚的,解决的问题是观点(意见)关系抽取,即在一句话中同时抽取出观点表达式和观点所对应的目标。首先用传统的pattern来保证可以跨领域,再在pattern上加强约束来保证准确率;之后,使用远监督来进一步提升覆盖率;最后,再使用一个CNN来对多个词组成的观点表达式进行判断,进一步提升性能。