明朝那些事儿(肆)——粉饰太平

朱厚熜继位后,改年号嘉靖,史称嘉靖皇帝。朱厚熜是明代最为聪明、心眼最多的一个皇帝。他本是湖北藩王兴献王的儿子,15岁的时候意外得知自己的堂兄死掉了,他要进京继承皇位。在这小小年纪,他通过两件事给满朝文武大臣一个狠狠的下马威。 第一件事是进京登基时,因为还不是皇帝,应该从东安门进宫,到文华殿暂住。他偏不,说要是不让从大明门进宫,直接去奉天殿,他就不当这个皇帝,回湖北老家去。群臣拿他没办法,只得照办。第二件事是明代著名的政治事件——“大议礼”事件。由于朱厚熜的父亲只是个藩王,并不是皇帝,朱厚熜登基之后,以杨廷和为首的老臣要求朱厚熜改爹,认上上个皇帝朱佑樘为爹,而改称亲爹为叔叔。朱厚熜顿时气炸了,当个皇帝还把自己亲爹当没了,岂有此理。于是,朱厚熜和杨廷和等人展开了激烈的辩论,由于涉及到古代礼仪制度的讨论,史称“大议礼”事件。在这起事件当中,杨廷和以退休威胁,一百多名政府高官在左顺门长跪示威;而嘉靖则派出礼部实习生张璁、桂萼等人写礼仪文书论战,并用武力解决长跪示威的群臣。经过一番折腾,嘉靖最终取得胜利,不但认了自己亲爹,还封亲爹为兴献皇帝。而杨廷和被准予退休,最后在老家去世,他的儿子杨慎被流放云南。此后三十余年,远离政治的杨慎,专心著书,研习学问,成为明代三才子之首,《三国演义》开篇的“滚滚长江东逝水”就出自杨慎之手。 嘉靖是一个非常精明的人,他充分利用身边的人,但又不让任何人独揽大权,威胁到自己的地位,所以他需要的大臣不是助手,也不是秘书,而是木偶——可以供他操纵的木偶,这个木偶就是张璁。张璁凭借“大议礼”事件平步青云,顺利进入内阁担任首辅,并除掉了提拔他的忠臣杨一清。随着官职越来越大,张璁越来越嚣张,在群臣中间拉帮结派,整治所有不服他的人。与此同时,另一个议礼的官员夏言开始威胁张璁的权力,于是张璁和夏言展开了激烈的骂战。张璁的党派越来越大,但夏言却奉行不结盟政策,因为他比张璁聪明,夏言看透了嘉靖——这是一个过分聪明自信的人,绝不会饶恕任何敢于威胁他的人,而已经是首辅的张璁,还在不断扩大势力范围,难道想做皇帝吗?所以,张璁的行为相当于自掘坟墓。终于,张璁在一次想要诬陷夏言的事件中,聪明反被聪明误,人格尽失,前途尽毁。而夏言成为了最终的胜利者,进入内阁,成为皇帝的第二个木偶。夏言是一个十分清廉的人,而且不畏权贵,在他的管理下,大明王朝兴旺发达,蒸蒸日上,还除掉了不学无术、贪污受贿的高干子弟郭勋。 当皇帝就像开公司,那些成功创业的首任董事长,一般来说都是极其生猛的,比如白手起家的朱元璋先生,大家都很服从管理。可等到首任老总过世,继任董事长能力不足,无法解决企业问题,无奈之下,只能对外招聘人才(科举制度),并聘任其中的精英当总经理(内阁首辅)帮助管理。然而问题在于,这位总经理并不一定听话,这在经济学上称为代理问题,而能从众多应聘者中脱颖而出,爬到这个位置的,一般都极其狡猾,绝对不是什么善类。娇生惯养的家族企业董事长很可能不是他的对手。为了能够控制局面,董事长又引进了新型人才——秘书(太监)。这类人学历不高,品行不好,心理也有问题,还喜欢欺负员工。但他们有一个共同的优点——听话,对董事长而言,这就够了。所以对于嘉靖而言,秘书(太监)绝不是他的敌人,而是他的朋友,综观整个明代,无论太监如何猖獗,如何欺压大臣,却都要听皇帝的话。自明宣宗时起,太监就已然成为了皇帝的助手,协助统治这个庞大的帝国。 嘉靖十分清楚,在他的任期内,摆在眼前的有着两种选择——文化低,会拍马屁,十分听话的太监,或是学历高,喜欢掐架找碴,桀骜不驯的文臣。连瞎子也知道,前者比后者容易对付得多,所以他的众多同行都选择了太监,但是嘉靖却没有这样做。因为他很自信,他相信自己能够对付所有的人。这是一个极其艰辛的选择,从此以后,他将失去秘书的帮助,独立对付狡诈博学的总经理,事实证明,他成功做到了。姓张的也好,姓夏的也罢,无论下面闹得多么热闹,他都是冷静的旁观者和最终的裁决者。二十年过去了,胜利一直牢牢地握在他的手中,各色人等,无论学历、民族、性别、星座、个人嗜好,只要是给他干活的,全都被治得服服帖帖。绝顶高手的生活是比较痛苦的,既然没有对手,那就得另外找事干,很快,嘉靖先生就找到了精神寄托——修道。特别是在一次熟睡中被绑架最终死里逃生之后,嘉靖的心灵受到严重的创伤,他从此不再上朝,而是跑到西苑(今中南海)修道炼丹。 嘉靖算是消停了,但大臣们的斗争才刚刚进入高潮。夏言之后,明代第一奸臣严嵩出场。严嵩出生在一个中产阶级家庭,通过科举考试一步步往上爬,当上礼部尚书后,他开始阿谀奉承,逢迎皇帝,最后居然当上了内阁首辅。嘉靖看着严嵩越来越武断专横,决定将其降级为次辅,让夏言入阁担任首辅。于是,严嵩和夏言开始了激烈的斗争,严嵩和他聪明的儿子严世蕃利用夏言的各种问题,如不戴皇帝送的香叶冠、讽刺皇帝修道、严嵩和太监的谗言等,激怒嘉靖。最终,嘉靖赐死夏言,严嵩恢复为内阁首辅。严嵩经过十多年的斗争,终于战胜了夏言,用一种极为卑劣的手段。徐阶目睹了正直无私、勤勉为国的夏言被严嵩陷害的过程,但他无动于衷,因为他知道目前自己的力量还很弱小,不足以抗衡严嵩,他在隐忍,等待时机的成熟。 就在这一时期,发生了明朝历史上另一个耻辱的事件——“庚戌之变”。当时蒙古部落是鞑靼的俺答当政,他是一个很能杀,很能抢,善于破坏的人。庚戌年,俺答带着上万蒙古骑兵进攻北京。嘉靖得知俺答进犯,问严嵩怎么办,严嵩无能,说俺答只是来抢东西,等他们抢够了自然会撤退。一旁的徐阶却通过研究俺答的文书,想出了缓兵之计。在拖延俺答进军的这段时间,京城的防务加强了,军队数量也从劣势转为优势。但嘉靖下达的反攻命令被严嵩偷偷拦下来了,理由是在京城眼皮底下,如果反攻失败,那就不好办了。所以,虽然京城的兵力增强了,但严嵩依然放任俺答在京城周边烧杀抢掠,坐视不管。嘉靖知道后,处死了负责反攻的兵部尚书,但他并不知道幕后的怕死鬼是严嵩。 “庚戌之变”之后,皇帝继续在西苑炼丹修道,严嵩把持朝政。兵部官员杨继盛看清了事情的真相,朝局黑暗、民生凋敝的罪魁祸首就是严嵩。于是,杨继盛决定以死上书弹劾严嵩,但严嵩的势力过于强大,嘉靖还是未能看清严嵩的真面目,而杨继盛也被严嵩活活整死。 嘉靖年间, 除了北边的蒙古骑兵来闹事,东边的倭寇也不安分,他们常常在浙江沿海登陆,抢劫富庶的长江流域。此时的抗倭总指挥是胡宗宪,胡宗宪手下的阵容也非常强大,文有谋臣徐渭,武有名将俞大猷和戚继光。他们通过分析发现,事实上,日本倭寇远道而来,之所以能在中国肆意抢劫,都是因为有中国人带路。拨开日本海盗的重重迷雾之后,真正的倭寇是两个中国人,一个叫汪直,另一个叫徐海。汪直是一个生性狡诈的人,当时日本正值战国时期,汪直通过走私军火到日本市场而发家。随着生意越做越大,汪直干脆把公司开到了日本本土上,为了保护自己的海上贸易,汪直组织了自己的私人武装。总之,汪直在日本的公司俨然是一个国中之国,连日本诸侯都要让他三分。徐海的实力比汪直要差一些,汪直严格意义上来说不是汉奸,而徐海却是货真价实的汉奸。徐海在倭寇手下干活,给倭寇当买办,是一个十分强悍的汉奸。 面对这两个倭寇,徐渭给胡宗宪出了两个不同的点子。对于徐海,由于势力较弱,胡宗宪通过离间计和各种谋略机巧,成功击败徐海,徐海走投无路,投水自尽。对于汪直,由于他的势力过于强大,硬碰硬打不过,于是胡宗宪主动向汪直示好,以谈判麻痹对手,等待时机的到来。可是没想到,在一次和平谈判后的游玩活动中,汪直被当地的愣头青抓起来并处死了,胡宗宪苦心经营的计划毁于一旦。由于汪直生前的势力过于强大,汪直死后,他的手下炸开了锅,大举入侵江浙地带,最黑暗的时刻到来了。在这危难时刻,胡宗宪手下的俞大猷和戚继光前仆后继,纷纷训练出自己的俞家军和戚家军,最终击溃倭寇,历时十多年的长期战斗,日本强盗们终于被赶出了中国。 而这几位抗倭英雄的后续命运也各不相同,胡宗宪被被人诬陷告状,而自杀于狱中。俞大猷后来大起大落,被升官又被降职,最终在万历年间去世,追封左都督。戚继光后来去了蓟门,在这里,他将得到盟友张居正的全力支持,发挥出最大的能量,关于他的故事还很长。徐渭在自杀失败之后,消极度日,晚年在贫病交加中去世。 让我们把目光再次聚焦到京城,徐阶和严嵩的斗争还在继续。经过多年的观察,徐阶发现严嵩之所以能够长盛不衰,枝繁叶茂,只是因为有儿子严世蕃在后台助攻。于是,徐阶借道士跳大神的时候,假传仙人旨意,告诉嘉靖严嵩是奸臣,而徐阶是贤臣,并且发动群臣弹劾严世蕃。终于,在种种事件的推波助澜下,嘉靖大怒,把严世蕃打入大牢,并且撤了严嵩的官职。但严嵩毕竟混迹官场几十年,没那么容易倒台。严世蕃在发配充军的路上,跑回了老家江西,而且还堂而皇之的住进了大别墅,当起了土财主。徐阶得知后,继续派人弹劾严世蕃。最终,嘉靖大怒,对严世蕃斩立决,这位才学出众却又无恶不作的天才就此结束了他罪恶的一生。严世蕃死后,严嵩被抄家,这位昔日的首辅转行当了乞丐,两年之后于荒野之中悲惨死去。正义终于得到伸张,以徐阶的方式。严嵩倒台之后,徐阶成为新的内阁首辅,手握大权。

January 21, 2020 · 1 min

明朝那些事儿(叁)——妖孽宫廷

朱祁镇凭借还乡团成员石亨、曹吉祥、张軏、徐有贞和李贤,成功复辟。朱祁镇复辟之后,还乡团成员自然不会忘记他们帮朱祁镇复辟的目的——杀于谦。于是,在徐有贞捏造的莫须有的罪名之后,北京保卫战第一大功臣于谦被下令斩首;内阁也被还乡团扫荡一空,朝廷上下全部换成了还乡团的人。 然而,还乡团成员并没有过上幸福生活,反而出现了内斗。原因是徐有贞是一个有追求、有理想的坏人,而石亨和曹吉祥除了有野心和贪欲,其他啥也没有。于是还乡团分为两派,一派是徐有贞和他提拔的李贤,另一派是石亨和曹吉祥,两派正式开始了内斗。事实上,这些人里面还有第三派,即李贤,他虽然是徐有贞提拔起来的,但他自成一派。自北京保卫战之后,李贤认识到,在这样一个污秽的地方,还有像于谦这样勇于任事,刚正不阿的人。在于谦被杀之后,李贤决定为于谦讨回公道。于是他的敌人是整个还乡团成员,包括石亨、曹吉祥和徐有贞,但表面上,李贤暂时和徐有贞一派。 内斗结果是,徐有贞最先被淘汰,充军云南后回到故乡,在人们的鄙视和谩骂中死去。接着,石亨的种种任人唯亲、贪污腐败的行为不断引起朱祁镇的反感,在李贤的推波助澜之下,石亨光荣入狱并惨死狱中。最后,曹吉祥也慌了,知道自己即将大难临头,他和养子曹钦居然密谋造反,最后造反失败,被凌迟处死。至此,历时五年,还乡团成员全军覆没,正义得到了伸张,李贤名留青史。 经历了无数的刀光剑影,权谋斗争,朱祁镇平静地走向了自己人生的终点。这位皇帝的一生并不光彩,他宠信过奸邪小人,打过败仗,当过俘虏,做过囚犯,杀过忠臣,要说他是好皇帝,真是鬼都不信。但他是一个好人,他几乎信任了身边每一个人,可事实证明,好人是做不了好皇帝的。在临死之前,朱祁镇废除了“皇帝驾崩,后宫殉葬”的制度,算是给他的人生添加了一抹亮色。朱祁镇死后,皇位传给了他的长子朱见深,由此开启了一个让人哭笑不得的朝代。 由于父亲的悲惨遭遇,朱见深在童年时受尽了累,吃够了苦。在朱祁镇战败被俘之后,哥哥朱祁钰成为代理皇帝。孙太后担心皇位旁落,急忙拥立朱祁镇的儿子朱见深为太子,并且派出亲信一个姓万的宫女,去保护朱见深。那一年,万宫女十九岁,朱见深两岁。在万宫女无微不至的照料下,朱见深对万宫女产生了感情。即使在朱见深当上皇帝之后,他在后宫中宠幸最多的依然是比自己大十七岁的万阿姨(此时已经是万贵妃)。万贵妃曾经给朱见深生了一个儿子,但这位皇子一年之后就夭折了,此后万贵妃年纪太大无法生育。虽然朱见深对万贵妃宠幸最多,但他也会临幸其他妃子或宫女,为什么这么久过去了,他还没有任何子女呢。因为万贵妃仗着朱见深对她的宠幸,雄霸后宫,只要听说哪个宫女或妃子怀孕了,就偷偷派人逼宫女或妃子堕胎! 改变这一现状的是一个姓纪的姑娘。成化初年,广西发生叛乱,朝廷平定叛乱之后,抓了一些年轻的男男女女送到京城,男的会被阉割成为太监(之前的郑和就是这么来的),女的会被安排做宫女。在这批进宫的人中,有一男一女,给大明帝国带来了深远的影响。男的叫汪直,女的就是这位纪姑娘。 纪姑娘进宫之后,被安排作为钱库管理员。有一次皇帝视察钱库,喜欢上了纪姑娘,于是直接就“临幸”了,然后纪姑娘就怀孕了。按说这个时候万贵妃就该派人来逼迫堕胎了,但因为纪姑娘平时人缘很好,来逼迫堕胎的宫女主动替纪姑娘撒谎说只是生病没有怀孕。后来,纪姑娘生下了孩子,万贵妃派太监张敏来溺死这个孩子,张敏也非常慈悲地没有这么做,而是接走了孩子帮忙抚养。在张敏无法负担抚养费时,前任皇后吴小姐主动接过孩子进行抚养。在孩子六岁的时候,张敏最终把这个秘密告诉了朱见深,这个孩子从此有了自己的名字——朱佑樘。朱佑樘搬进宫里住了不到一个月,他的母亲纪姑娘死于后宫住所,死因不详。有说被逼自杀,有说突发重病身亡,但她的死因却似乎并没有引起什么争议,因为所有人都知道凶手的名字以及行凶的动机。不久之后,太监张敏在宫中吞金自尽,当一个人不得不走向死亡时,自杀代表着尊严和抗争。此后,万贵妃不敢再堕别人的孩子,朱见深见形势大好,接连生了十几个儿子。 在朱见深统治时期,明朝上下乌烟瘴气,五大门派明争暗斗,朝政一塌糊涂。这五大门派分别是春派,负责给皇帝研制春药,掌门人是梁芳;仙派,负责给皇帝研制长生不老之药,掌门人是李孜省;监派,负责各种特务工作,掌门人是汪直和尚铭;后派,皇帝后宫,掌门人是万贵妃;混派,混日子的文官集团,掌门人是万安。其中春派和仙派的掌门人都是万贵妃提拔起来的,所以后派、春派和仙派是同盟关系,称为泛后阵营;监派内部存在矛盾,即西厂的汪直(当初平定广西叛乱带入宫的男的)和东厂的尚铭有内部矛盾,但对外一起对抗泛后阵营;混派派如其名,谁都不敢得罪,只能乖乖混日子。归根到底,成化年间的乌烟瘴气,都是因为朱见深的软弱无能。在万贵妃去世后,朱见深彻底崩溃病倒了,没过多久,也去世了。 朱见深死后,他和纪妃的儿子朱佑樘继位,开启弘治时代。朱佑樘上位之后,就开始大刀阔斧地清理五大门派的垃圾,并起用王恕、马文升两位老前辈。在王恕、马文升的支持下,三个人相继进入内阁:刘健、李东阳、谢迁。此三人通力合作,发挥各自所长,大明帝国国力强盛、天下太平。 在这期间,发生了唐伯虎的故事。唐寅,字伯虎,江苏吴县人,从小就被人称为天才,就是那种不用头悬梁锥刺股就能学富五车的人。唐伯虎在进京赶考的路上,遇到了另一个赶考的人,徐经。考完之后,他们两和主考官程敏政就被判合谋作弊而锒铛入狱。事情的经过是这样,考完之后,很多考生一起吃饭,猜测谁能中进士,此时,唐伯虎就高调地说自己肯定能中进士。虽然凭唐伯虎的才能,他确实很有可能中进士,但他这么高调自信,难免让人怀疑他可能提前知道了考题。考试结果恰巧是只有唐伯虎和徐经中了进士,于是大家就举报考官程敏政泄题了。经过调查,可能是程敏政的仆人出卖考题给徐经,而程敏政和唐伯虎是否有合谋作弊,真相就不得而知了。最后结果是程敏政被迫退休,回家不久就去世了;而唐伯虎对前途心灰意冷,四处逛妓院,开始了流浪生活;徐经对科举恨之入骨,告诫后代不要读书,于是很多年后,他的儿子的儿子的儿子徐振之,此人不爱读书,只喜欢旅游,别号徐霞客。一番折腾下来,大明王朝少了两个官僚,却多了一个浪荡才子和一个地理学家,倒也不是件坏事。 朱佑樘在位期间,不顾身体夜以继日地工作,为大明王朝献出了自己的一切。由于工作强度太大,三十多岁已经重病缠身,弘治十八年就去世了。 朱佑樘去世后,他的儿子朱厚照继位,明代历史上最能闹的一位皇帝出场了。朱佑樘命不好,只生了两个儿子,还有一个病死了,所以朱厚照成为了独苗,打不得骂不得,无数败家子就这么炼成了。 朱厚照最大的特点就是爱玩,怎么好玩怎么玩,翻过来覆过去,天翻地覆,鬼哭神嚎,也只是为了一个字——玩。所以,朱厚照经常不在宫里好好待着,老跑到外面去四处闲逛。这可急坏了朝廷百官,国不可一日无君,万一朱厚照在外面玩的时候有个三长两短,大明江山怎么办。于是文官集团不断上书请朱厚照好好工作、好好当皇帝。朱厚照觉得文官集团很烦,此时,太监刘瑾在皇帝身边吹风,告诉朱厚照你是皇帝,你想怎样就怎样。由于刘瑾很能哄爱玩的朱厚照,于是以刘瑾为首的太监集团不断得到皇帝的重用,刘瑾集团和以刘健、李东阳、谢迁为首的内阁形成了矛盾对立的两派。在这两派的斗争中,内阁集团败下阵来,刘健和谢迁相继告老还乡,而李东阳留了下来,他将肩负起匡扶正义、铲除刘瑾的重任。有时候,屈辱地活着比悲壮地死去更需要勇气。 在这期间,插播一段王阳明的传奇故事。王守仁,字伯安,别号阳明,出生于浙江余姚。王阳明家是远近闻名的大地主,父亲王华是状元,还给皇帝当过讲师,位高权重。可儿子王阳明好像不学无术,整天稀奇古怪的,特别是有一天王华发现王阳明正待在自家花园,对着一枝竹子发呆,一动不动。后来王华才知道,儿子王阳明在“格”竹子。因为他想做圣贤,有人告诉他做圣贤需要学习先辈朱熹“格物穷理”,去追求世界上最为深邃、根本的道理。宋明理学的另一位伟大导师程颐也说:“今日格一物,明日又格一物,豁然贯通,终知天理。”所以王阳明每天格一样东西,今天格格竹子,明天就可能格梅花了。这就是中国历史上著名的守仁格竹的故事。但是格了好几天,王守仁也没悟出个道理,于是他就听他爹的话乖乖去考科举当官了。 可由于王阳明的刚正不阿,得罪了刘瑾集团,被贬到贵阳市的一个县当招待所所长。在那个穷乡僻壤,经过几年的悟道,王阳明终于悟出了这世间的终极智慧,朱熹宣扬的“存天理、去人欲”是不合理的,而天理即是人欲!王阳明顿悟了,中华文明史上一门伟大的哲学“心学”就此诞生。 当王阳明在贵阳乡下悟道的时候,朝廷上正上演惊心动魄的政治风波。由于刘瑾把持朝政、欺压百姓,宁夏地方军和镇守宁夏的藩王安化王打着“杀死刘瑾,为民除害”的口号,起兵造反。叛乱很快被杨一清平定,然后李东阳、杨一清和杨廷和拉拢了仇视刘瑾的另一个太监张永,借着安化王叛乱的事情,把刘瑾的各种罪名都和朱厚照讲了一遍。最后,朱厚照终于知道了刘瑾的真面目,并且意识到自己处境的危险性,当即决定凌迟处死刘瑾。经过殊死的搏斗,正直的力量终于占据上风,大明王朝再次回到正常的轨道上。李东阳,这个昔日唯一留下来的内阁成员,终于得到了解脱,告老还乡。 虽然经历了刘瑾事件,但朱厚照爱玩的天性没有改变。他千方百计想要摆脱百官的束缚,到民间撒欢。甚至有一次还偷偷跑到关外,主动招惹蒙古部落。不过在那次跑到关外,御驾亲征蒙古骑兵的战争中,朱厚照居然意外地展示了他的高超的军事才能,击溃了蒙古骑兵的进攻。 不久之后,当初朱棣靖难之役中挟持的宁王朱权的后代宁王朱宸濠在封地南昌起兵造反。而王阳明在杨一清和兵部尚书王琼的支持下,也走出了贵阳乡下,担任了江西巡抚。宁王叛乱之前,花费巨资收买了朝廷上很多官员,于是,朱厚照到很晚才知道宁王叛乱的事情,而且并不了解事态的严重性。王守仁在没有中央军援助的情况下,通过招募江西周边的地方军,以及各种巧妙的兵法和心理战术,最终大胜叛军,俘虏朱宸濠,平定了宁王之乱。 宁王之乱平定时,朱厚照并不知道叛乱已经平定了,凭着爱玩的天性,他决定御驾亲征,平定叛乱。实际上,朱厚照是想借着平定叛乱的名,下江南玩一玩。而另一个拍马屁的太监江彬刻意封锁了宁王之乱被平定的消息,他有一个宏伟的计划,他想趁朱厚照下江南期间,偷偷杀掉朱厚照,自己当皇帝,于是他也很想让朱厚照御驾亲征。 王阳明知道朱厚照御驾亲征的消息之后,非常震惊。想想看,一个皇帝带着几十万军队,走到哪都是一笔巨额开销,肯定会导致当地百姓民不聊生。于是王阳明极力劝阻朱厚照不要亲征了,叛乱已经被平定了。王阳明的行为违背了江彬的意愿,于是江彬不断找王阳明的麻烦,甚至想杀掉王阳明。好在王阳明通过智慧,拉拢了另一个太监张永,保住了性命。而江彬的胆子也太大了,在皇帝游览南京牛首山时,把皇帝藏了起来,制造了皇帝离奇失踪的案件。这是江彬在试探百官的反应,以便为进一步造反篡位做准备。王阳明等大臣知道后,开始安排南京、江西等地的守备军进行军演和搜查,江彬知道自己的阴谋被识破之后,没过几天,朱厚照又现身了。可在返回京城的路上,路过清江浦时,皇帝在当地的池子里钓鱼,结果意外跌落水中,虽然被随从救上岸,但没过多久就病倒了,最后离奇死亡,结束了他多姿多彩的传奇一生。 朱厚照死了之后,朝廷中实际掌权的是杨廷和,杨廷和邀请江彬进宫参加一个奠基仪式,并且仅允许江彬一个人独自进宫。江彬居然欣然前往,最后当然是被埋伏在宫内的人干掉了。干掉了江彬之后,杨廷和要考虑谁当皇帝的问题。由于朱厚照玩得太狠了,没生孩子,于是杨廷和安排朱见深的孙子,朱厚照的从弟朱厚熜继位当皇帝,这就是明朝历史上在位时间第二长的嘉靖皇帝。 在朱厚照统治的正德年间,王阳明是一个伟大的人。他经历了父亲的训斥,格竹子的执著,刘瑾的廷杖,龙场的悲凉,悟道的喜悦,悲愤的逃亡,平叛的奋战,如此多的官场风波,刀光剑影,几起几落,世上再也没有一样东西,可以扰乱他的心弦。他历经坎坷,却意志坚定,混迹官场,却心系百姓,他反对暴力和贪欲,坚信正义和良知。他是伟大的政治家、思想家、军事家,他是真正的圣贤!

December 1, 2019 · 1 min

明朝那些事儿(贰)——万国来朝

朱棣夺取皇位之后,励精图治,发展经济,提倡文教,采取了许多措施大力发展经济,使得天下大治,国家富强,疆域辽阔,被称为永乐盛世。具体措施有以下几点: 郑和下西洋。朱棣进驻南京之后,没有发现朱允炆的踪迹,于是派出两队人马寻找朱允炆的下落,一路是郑和从海路出发,另一路是胡濙从陆路出发。郑和,原名马三保,是云南一个虔诚的伊斯兰教徒。洪武年间,朱元璋军队远征云南,俘虏并阉割了幼小的马三保。后来燕王朱棣挑选马三保作为自己的贴身侍卫。马三保在靖难之役中与朱棣出生入死,立下大功,被朱棣赐姓郑,马三保遂改姓名为郑和。郑和一生七下西洋,远航西太平洋和印度洋,沿海拜访30多个国家和地区,包括伊斯兰教圣地麦加。郑和下西洋虽然没有找到朱允炆的下落,但七下西洋不但宣扬了国威,还大力开拓了海外交流,带来了一大批西洋各国使者,开创了万国来朝的局面。 另一路胡濙的工作就不像郑和那样光明正大了,因为胡濙没有郑和下西洋明面上的任务,他的任务只有一条,就是寻找朱允炆。但寻找朱允炆又不能明说,因为这样无异于告诉所有的人,建文帝还活着,心中别有企图的人必然会蠢蠢欲动,这个皇位注定是坐不稳了。所以胡濙一个人隐匿在平民老百姓中间,在江浙一带晃悠,打探朱允炆的下落。经过十六年的苦苦寻觅,在朱棣远征蒙古的时候,胡濙带着答案来到朱棣的营帐。史料并没有明确记录朱允炆的下落,但当年明月推断胡濙找到了朱允炆,而且两个人进行了亲切友好的会谈,朱允炆表示他不想和朱棣争这个皇位了,只想好好过平民老百姓的日子。朱棣悬了十六年的心终于放下了,他终于可以安心做他的皇帝了,不用担心哪天冒出个朱允炆要和他抢皇位。 编撰《永乐大典》。永乐年间国立昌盛,朱棣为了显示自己的雄才大略,命令朝廷修了一部前无古人的书——《永乐大典》。这本书是古往今来最齐备、最完美、最优秀的百科全书。《永乐大典》由解缙和姚广孝主持编撰,编撰队伍累计达3000多人,前后历时5年才完成。它包含先秦以来所有经典的书,约3.7亿字,太伟大了!不过大典副本大多毁于火灾或战乱,现今仅存800余卷且散落世界各地。 迁都北京。朱棣迁都的原因有两个,包括政治原因和个人原因。政治原因是永乐时期,虽然明朝国力强盛,但北方蒙古军队经常南下骚扰明朝,被明军击败没多久又来骚扰,搞得北方边境鸡犬不宁。本来朱棣被分封为燕王,负责抵御蒙古入侵,现在朱棣到南京当皇帝之后,北方边境没有得力干将。即使有,朱棣估计也不放心把一支强大的军队放在远离京城的地方,万一像自己一样造起反来可不得了。如果迁都北京的话,既能亲自掌控军队,又能抵御蒙古入侵,两全其美。那时候南方并没有强劲的外敌,所以南方不需要布置很强大的军队,北京也就不用担心南方军队的造反了。个人原因是朱棣之前被分封为燕王,习惯了北方的生活,所以迁都北京之后他的个人生活会更舒服一些吧。 天子守国门。永乐年间,朱棣多次御驾亲征,比如多次深入漠北,远击鞑靼;南下安南(越南),平定叛乱等。朱棣是一个热爱并享受战争的皇帝,他在位期间,多次御驾亲征,甚至在他65岁的时候还亲自出战漠北,也就是在这一年,他病死在征战的路上。此外,朱棣还恢复了特务机构锦衣卫,新建了另一个以宦官为主的特务机构东厂,还组建了内阁分担自己的管理工作,这些制度都对明朝后期产生了深远的影响。 朱棣的一生兢兢业业,平定天下,迁都北京,修成大典,沟通南洋,威震四海,平定安南,打压蒙古。在执政的十几年中,他不停地忙活,不停地工作,付出了许多心血,也获得了许多成就,正是这些成就为他赢得了一代英主的名誉。从某种意义上来说,朱棣和父亲朱元璋很像,具有“要么不做,要么做绝”的狠劲,也都成就了一番霸业。 永乐后期,朱棣的两个儿子——长子朱高炽和次子朱高煦——展开了皇位争夺战。最终长子朱高炽胜出,赢得皇位,史称明仁宗。但是朱高炽英年早逝,只当了不到一年的皇帝就去世了,由嫡长子朱瞻基继位。朱瞻基在位的时间也不长,只有十年,加上他父亲的统治时间,也只有十一年。但他和他父亲统治的这短短十一年,却被后代史学家公认为是堪与“文景之治”相比的“仁宣之治”,是中国历史上的盛世。何以有如此之高的评价,盛世何来?来自休养生息,清静养民。不干扰百姓们的生活,增加他们的负担,为其当为之事,治民若水,因势利导,才是皇帝治国的最高境界。这样的皇帝才是好皇帝。 朱瞻基死后,长子朱祁镇继位,史称明英宗。明英宗时期发生了一件大事,大到差点导致明朝的灭亡。前面我们说到朱棣组建了内阁分担自己的工作,一方面虽然减轻了皇帝的负担,但另一方面也分化了皇帝的权力。那时候处理各种奏章,往往是内阁大臣先草拟好处理意见,提交给皇帝批阅,皇帝同意则执行,否则的话需要另行讨论。前者称为内阁的“票拟”权,后者称为皇帝的“批红”权。虽然皇帝有一票否决权,但内阁毕竟人多势众,有可能导致权力慢慢被内阁掌控。皇帝为了维持这个平衡,又启用了另一批人——太监——代为批红。此时,皇权相当于分布在内阁、太监和皇帝三者手中,内阁和太监拔河,皇帝居中或者偏向于太监。 这个制度看起来还不错,简单而有效,还有点“三权分立”的感觉。但是凡事都不是完美的,在朱祁镇时期,一个奇特的宦官王振打破了这种平衡。王振本为落第秀才,略通经书,后为教官(乡村老师)。为了实现自己的远大抱负,王振自阉进宫,一开始教太监读书,后来又成为太子朱祁镇的老师,由此和朱祁镇结下了深厚的感情。朱瞻基死后,朱祁镇继位,一开始由于有太皇太后及前朝老臣的辅政,王振不敢放肆,国势太平。后来随着辅政的太皇太后和大臣们相继死去,王振勾结内外官僚,擅作威褔。由于朱祁镇从小奉王振为老师(先生),对王振很尊重甚至听从,于是大权落到王振手中。可王振只是个落第秀才,放到今天也就是个初中生,怎么可能管理好明朝这么大一个帝国。 王振把持朝政之后,任人唯亲,广结党羽。这个时期,瓦剌太师也先统一蒙古,侵犯明朝北部边境。大同前线败报不断传到北京,明英宗朱祁镇在王振的煽动下,带领明军所有精锐部队大概20万和文武百官,御驾亲征。由于组织不当,一切军政事务皆由王振专断,多次中了也先的诡计。而且更可恶的是,王振本来出身很一般,现在一人之下万人之上,他想带着皇帝去他的家乡显示威风,但行军路上又担心军队损坏他的田园庄稼,多次变更行军路线,导致士兵疲惫不堪。最后在撤军途中,被也先军队在土木堡全部歼灭,史称土木堡之变。这一战的结果是皇帝朱祁镇被俘虏,王振被乱军所杀(一说被愤怒的明军所杀,一说被蒙古军所杀),明朝精锐部队被歼灭,文武百官死伤无数。明朝真正到了生死存亡的地步。 朱祁镇亲征之前,把皇位暂时交给了弟弟朱祁钰管理。此时,留守在京城的都是些老弱病残的二线部队,朝廷也没有多少能人。很多官员主张把首都南迁到南京,以躲避蒙古的进攻,朝野上下议论纷纷,莫衷一是。此时,兵部侍郎于谦站了出来,怒吼一声“建议南迁之人,该杀!”。于谦十分清楚,逃就会丢掉半壁江山,沦落到南宋的地步,所以不能逃。 于谦的一番怒吼震醒了那些犹豫不决的人,很多人开始站在于谦的一边,最终打动了代理皇帝朱祁钰,并坚定了他抵抗到底的决心。由于于谦已经代理了兵部尚书,且又是主战派的代表人物,所以朱祁钰便把防守北京的重任交给了于谦。在于谦的带领和指挥下,全国各地的预备役部队紧急调往北京进行防御,同时把通州的粮仓运送到北京城,有了军队和粮草,京城的人心和军心逐渐稳定下来。此外,对乱权宦官王振的秋后算账也开始了。虽然王振本人已死,但其党羽犹存,在某一次上朝议事期间,朝野上下,群臣激奋,为了泄愤,群臣们居然把锦衣卫头目、王振的亲戚给活活打死了,而且朱祁钰对他们的行动进行了默许且声明他们无罪,这种朝廷议事时的乱象在明朝历史上可谓是绝无仅有。 军队开到了,粮食充足了,王振的余党也彻底清除了,在于谦的努力下,很多棘手的问题都得到了解决。此时,无论是京城的大臣还是老百姓和士兵,都已经有了对抗强敌的勇气和决心,他们开始相信,即将到来的这个敌人并非不可战胜,获得这场战争的胜利并非只是幻想。这种信心和勇气来自于站在他们背后的那个人——于谦。从一盘散沙到众志成城,于谦的威望达到了顶点,所有的人都相信,这位兵部尚书有能力带领他们击败任何敌人。 一个月之后,大明王朝和蒙古军队的正面对抗正式开始。也先带着骁勇善战的蒙古骑兵,兵临北京城下。此时,于谦召开了战前的最后一次军事会议,会上颁布了明朝历史上著名的军战连坐法: 凡守城将士,必英勇杀敌,战端一开,即为死战之时! 临阵,将不顾军先退者,立斩! 临阵,军不顾将先退者,后队斩前队! 敢违军令者,格杀勿论! 此外,于谦下达了最后一道命令:“大军开战之日,众将率军出城之后,立即关闭九门,有敢擅自放入城者立斩!”听到这些命令时,在场的所有人都惊讶地看着这个手无缚鸡之力的文弱书生。一个月前于谦还是一个从未指挥过战争的文官,现在却像换了一个人似的意志坚定和果敢严厉。于谦毫无惧意地看着这些惊讶的人,对他们说出了最后的话:“数十万大军毁于一旦,上皇被俘,敌军兵临城下,国家到了如此境地,难道还有什么顾虑吗?若此战失败,大明必蹈前宋之覆辙,诸位有何面目去见天下之人!“拼死一战,只在此时!”看这段文字的时候刚经历国庆70周年阅兵,享受着祖国的繁荣昌盛。回想起五百年前国难当头,于谦以一己之力,凝聚起全城人心,背水一战,破釜沉舟,不觉泪目,这需要何等的勇气和智慧啊!在国家出现危难之时,总有一些人挺身而出,为国效力,这样的人,我们称为英雄。于谦就是这样一个英雄,挽狂澜之既倒,扶大厦之将倾。 终于,在于谦的鼓舞下,明军士气大涨,大家都坚定了决战的信念。经过两个多月的激战,蒙古军队无功而返,并在撤军过程中遭到明军的火炮攻击。至此,北京保卫战结束,大明完胜。从一盘散沙、行将崩溃到众志成城、坚如磐石,从满天阴云、兵临城下到云开雾散、破敌千里,大明帝国终于转危为安,北京保卫战创造了一个力挽狂澜的奇迹。而这个奇迹的缔造人正是于谦。 明朝虽然获胜,但只是保住了北京城,不至于到亡国的地步,明朝的前皇帝朱祁镇还在也先手中,此时明朝的皇帝是朱祁钰。本来朱祁钰和哥哥朱祁镇的关系挺好的,但朱祁钰代理皇权之后,当皇帝当上瘾了,不想让朱祁镇回来。也先觉得既然明朝已经换皇帝了,留朱祁镇在这里也没什么用,就把朱祁镇还给了明朝。可没想到朱祁镇回北京之后被朱祁钰囚禁了起来,朱祁镇就这样和自己的老婆钱皇后过了八年的囚徒生活。可上天似乎也对朱祁钰的行为感到愤怒,朱祁钰唯一的儿子朱见济被立为皇太子一年以后突然去世,加上国事操劳,朱祁钰身体大不如前。而此时,另一个政治风暴也在酝酿之中。北京保卫战和于谦并肩作战的大将军石亨由于一些误解和于谦反目成仇,为了对抗于谦和朱祁钰,石亨拉上曹吉祥、张軏和徐有贞,打算复辟朱祁镇。于是在某一天夜里,石亨一路人马里应外合,悄悄打开了囚禁朱祁镇的大门,并且敲响了上朝的钟鼓,宣布朱祁镇复位。当朱祁钰听到这个消息后,他笑得很从容,并最终吐出三个字“好,好,好!”是的,朱祁钰已经疲倦了,他虽然囚禁了朱祁镇八年,但并没有得到快乐,这八年当中,他一直处于恐惧和孤独当中,现在他终于解脱了。

October 12, 2019 · 1 min

明朝那些事儿(壹)——洪武大帝

朱元璋,外号朱重八,1328年生于安徽凤阳。元朝取名字的习惯是父母年龄相加,所以推测此时朱元璋的父母年龄相加为88岁。元朝末年,朝廷腐败,苛捐杂税导致民不聊生。另外,1344年黄河泛滥、淮河流域遭遇严重瘟疫和干旱。朱元璋出生贫农,在这种天灾人祸的情况下,朱元璋的父、母、大哥、大哥长子等相继饿死,家里除了二哥,已经没有其他成员了。在这种情况下,朱元璋为了活下去,去附近的皇觉寺当和尚,主要工作是讨饭。 后来元朝进一步衰败,各地不断爆发农民起义。元朝的腐朽官吏迫于朝廷压力,在无法镇压起义军的情况下,会把老百姓抓取交差,把他们当起义军杀掉。在这种情况下,朱元璋面临一个两难的选择,如果不起义,则有可能被元军抓去当作起义军杀掉;如果起义,则万一起义失败,则同样性命难保。就在此时,朱元璋幼年的朋友汤和写信邀请朱元璋加入他的起义军,共图大业。朱元璋本不想加入,但由于书信被别人告发,朱元璋被逼上梁山,正式开始了他的造反事业。 造反的过程就不赘述了,朱元璋一开始投靠了汤和的老板郭子兴,后来由于出色的才能,脱离郭子兴开始独立创业。朱元璋从安徽开始,一路向东,沿途占领了很多城市,最终攻下南京(应天)作为自己的根据地。在南京,朱元璋又相继灭掉了他的两个强大的邻居,同样是起义军的陈友谅和张士诚。其中,和陈友谅的鄱阳湖水战被视为中世纪世界规模最大的水战,同时也是中国历史上继赤壁之战后的又一个以少胜多的典型战例,而且也是其中一方巧用火攻取得了胜利。 消灭了几大起义军之后,朱元璋迎来了他最后的敌人——元朝,朱元璋北伐开始。但已到强弩之末的元朝实在是太弱了,没多久就被朱元璋赶到了大漠之外。1368年,朱元璋即皇帝位,定年号为洪武,国号为明,明朝正式成立。 这里有必要提一下朱元璋霸业中的文臣武将。谋臣刘基,字伯温,通经史、晓天文、精兵法,他以辅佐明太祖朱元璋完成帝业、开创明朝并保持国家安定,因而驰名天下,被后人比作为诸葛武侯。后人赞赏刘基道:“三分天下诸葛亮,一统江山刘伯温”。武将就更多了,比如徐达和常遇春,一直跟着朱元璋征战沙场,特别是在鄱阳湖水战中,冲锋陷阵,对陈友谅发动突然袭击,为朱元璋的胜利立下了汗马功劳;此外还有李文忠、汤和、蓝玉、傅友德等人,他们要么是在军阀混战时期脱颖而出,要么是在北伐元朝的时候脱颖而出,总之都是战功赫赫、功高震主。当然,因为朱元璋,他们中的很多人下场都很惨,简要介绍请看这里:https://kknews.cc/history/m2n34eg.html。 明朝建立之后,朱元璋一方面为了巩固自己的权力,另一方面为了防止自己死后开国功臣抢儿子的权力,总之就是为了巩固朱家的江山,开始对开国功臣大开杀戒,制造了很多惨案。其中比较有名的是洪武四大案:胡惟庸案,空印案,郭桓案和蓝玉案。胡惟庸与蓝玉案件习称“胡蓝之狱”,是朱元璋诛杀开国功臣的政治事件,而“空印案”与“郭桓案”则是对涉嫌贪污的官吏进行大规模的镇压。除此之外,大大小小还有很多诛杀开国功臣的案件,基本上把前面列举的所有开国功臣都杀了。其中朱元璋的发小汤和得以善终。 当朱元璋把开国功臣杀得差不多的时候,朱元璋终于老去了,皇位传给了长孙朱允炆。朱元璋共有26个儿子,长子是朱标(太子)、四子朱棣(燕王)、十七子朱权(宁王)。朱元璋本打算把皇位传给长子朱标,但朱标先于其父亲朱元璋去世了,于是皇位就顺延到朱标的长子朱允炆手中。朱允炆继位之后很忧郁,因为朱元璋有二十多个儿子,被分封在全国各地,藩王势力日益膨胀,朱允炆于是与亲信大臣开始了一系列的削藩措施。大多数藩王都乖乖认命,有被贬的,被下狱的,被逼自杀的。当削藩到四叔朱棣头上时,朱棣起兵反抗,随后挥师南下,史称“靖难之役”。但仅凭朱棣一个藩的力量,和中央政权相比还是太过弱小,朱棣挟持了另一个藩王宁王,收编了其手下骁勇善战的朵颜三卫骑兵,一起反抗南京政权。由于朱棣被分封在北京,经常要和蒙古人大战,所以朱棣的有勇有谋,军事实力很强。而朱允炆领导的中央军队,由于绝大部分骁勇善战的开国功臣或老了或被朱元璋杀了,新生力量又没经历过真刀真枪,所以南京中央军队的军事实力比较弱。在这种情况下,朱棣的军队一路南下,最终攻下首都南京,夺取了侄子朱允炆的皇位,史称永乐大帝。而朱允炆在逃难的过程中下落不明。

September 12, 2019 · 1 min

【论文速读】End-to-End Differentiable Learning of Protein Structure

首先放出本文的Hightlights: 蛋白质三级结构预测一般分为两种方法,一种是基于模板的预测方法(Template-Based Modeling, TBM),另一种是从头测序方法(Free Modeling, FM)。TBM方法目前已经能达到比较好的预测精度,但并不是所有蛋白都有同源模板,当模板蛋白和目标蛋白的相似性低于某个阈值时,TBM方法的性能就会比较差。而传统的FM方法,需要过多的人工特征,使得整个流程非常复杂。 作者在一次报告中,将传统的蛋白质结构预测算法(上图)比作10年前的图像识别算法(下图),虽然10年前的图像识别算法也能达到比较好的性能,但需要很多人工设计的特征,比如SIFT特征等,不够简洁漂亮。随着深度学习的兴起,现在图像识别不再需要人工设计特征,只要搭建好神经网络,输入原始图片即可完成识别和分类,性能比之前的人工方法还要好。所以,作者也希望能提出一个简洁、纯深度学习的模型来预测蛋白质的三级结构。 本文的模型(Recurrent Geometric Networks, RGN)从宏观上来说就如博客开篇的图片所示,非常的简洁漂亮,输入是蛋白质的一维序列,经过神经网络,输出是每个氨基酸残基的三个扭转角,然后再通过三维重构,得到蛋白质的笛卡尔坐标。 更具体来说,RGN包括三个部分,分别是模型预测、三维重构和误差反向传播,下面分别介绍这三个部分。 模型预测是上图的左下角部分,即输入是蛋白质序列,输出是每个氨基酸残基的三个扭转角。因为每个氨基酸对应三个扭转角输出,每个氨基酸和其上下文的氨基酸有关联,所以使用双向LSTM最合适不过了。Bi-LSTM没什么好讲的,关键讲讲其模型的输入和输出。输入部分,作者把每个氨基酸编码成一个41维的向量,如上图所示,其中包括20维氨基酸的one-hot向量(因为只有20种氨基酸)、20维PSSM位置向量和1维具体的位置信息。其中的PSSM位置向量可以理解为这个位置上的不同氨基酸的概率分布,由于有20种氨基酸,所以PSSM向量维度也是20。网上没有找到氨基酸的PSSM向量示例,找到一个DNA的,如下图,每个位置上,字母越大表示出现该核苷酸的概率越大,换成氨基酸是类似的道理。所以整个网络的输入,除了PSSM矩阵,没有任何人工设计的特征,已经很优雅了。 https://davetang.org/muse/2013/10/01/position-weight-matrix/ Bi-LSTM的输出是三个扭转角,但并不是三个实数这么简单。作者首先把整个拉氏图平面聚类,比如聚类成m=60个点,然后就把输出离散化成60类的分类问题。分类输出采用Softmax归一化,这样就会得到60类的概率分布,如RGN网络图最右边的子图所示。60类的概率分布再通过加权平均的方式得到最终的三个扭转角的实数值。我很好奇为什么需要经过一个离散再加权平均的方法,Bi-LSTM直接回归输出三个扭转角的实数不是更省事吗? 预测得到三个扭转角之后,进入RGN的第二个阶段,就是三维重构,在RGN网络图的左上角。三维重构说起来也简单,就是根据每个氨基酸残基的三个扭转角,重构出蛋白质的三维结构。由于常规的蛋白质三维结构坐标系是笛卡尔坐标系(直角坐标系),所以需要把扭转角坐标转换为笛卡尔坐标,以便于求解误差。这个部分作者没有细说,因为是另一篇论文:Parallelized Natural Extension Reference Frame: Parallelized Conversion from Internal to Cartesian Coordinates。 最后就是怎样求解误差以及误差反向传播了。这个也比较有意思,想想看,对于一条长为L的蛋白质序列,给定预测的三维结构和真实的三维结构,怎样计算它们之间的误差。不能直接对应坐标相减,因为有可能两个坐标系的坐标原点不一样。作者的方法是这样的:对于预测结构,求每两个氨基酸的距离差,就是\(\tilde{d}_{j,k}\);对于真实结构,也做类似的操作。这样做的好处是抹掉了坐标原点的影响,用两点之间的相对距离来表示三维结构。然后,对真实的\(\tilde{d}_{j,k}^{(exp)}\)和预测的\(\tilde{d}_{j,k}^{(pred)}\)再求二范数\(||D||_2\),最后除以长度进行归一化,就得到了误差dRMSD。 上述dRMSD误差相比于之前领域内常用的TMscore,好处就是可微分,可自动求导,可梯度下降了;另外,如上所述,dRMSD不要求预测结构和真实结构进行对齐;但是有一点是dRMSD对size敏感,而且不能识别镜面对称这种错误结构,比如左手和右手的结构是镜面对称的,如果真实结构是左手,但模型预测成了右手,dRMSD是检测不到这种错误的。 模型介绍完毕,训练和测试数据集来自CASP竞赛。作者把每一届CASP比赛的数据集作为测试集,从CASP7~CASP12;每一届比赛之前公布的所有PDB数据集(seq, structure)作为对应测试集的训练集。其中,CASP11分出一部分作为验证集,用来优化网络超参数。 测试结果如Table 1所示,可以看到,在没有模板的FM类别中,本文的RGN预测误差是最小的;在有模板的TBM类别中,RGN的性能几乎垫底,当然这里参与评测的都是当届比赛中Top-5的模型,所以RGN和这5个模型比是垫底,但差距是很小的。 另外,作者提到,在TBM类别的数据集中,CASP的参赛模型比较依赖模板的质量。具体来说,对于真实的结构,如果模板结构和真实结构误差很小(y轴),则模型的预测结构和真实结构的误差也很小(x轴),这两个变量成一定的线性相关关系(第一行)。而对于本文的RGN,则没有这种相关关系,说明RGN一视同仁,不会受模板质量的影响,因为RGN是纯深度学习的模型,根本就没有用到模板。 在预测速度上,RGN虽然需要训练几周甚至上月的时间,但预测速度是毫秒级别的,是评测的几个模型中最快的。快速的RGN能使一些新的应用成为可能,比如药物发现、蛋白质设计等。 最后,总结一下本文的主要工作、创新点和局限性: 三个特点: torsional angles,局部信息 geometric units ,全局信息 dRMSD,局部+全局 创新点: 简洁,Model replaces structure prediction pipelines with one mathematical function 另辟蹊径,纯deeplearning,不依赖structural templates、co-evolutionary information、energy model等,本文预测融合了本文方法和领域知识的新模型有望解决蛋白质结构预测问题 局限性: 依赖PSSM矩阵 本文作者来自哈佛医学院系统药理学实验室,文章只有作者一个人,很了不起了。哈佛医学院的另一个教授评价作者:“AlQuraishi 研究的特点在于,一名埋头在哈佛医学院和波士顿生物医学社区丰富研究生态系统中的研究人员,居然能够在计算机科学最热门的领域里抗衡谷歌等巨头。——Peter Sorger”,太棒了,我也想做这样的研究。 ...

August 30, 2019 · 1 min

CS224N(2.12)Convolutional Networks for NLP

今天我们介绍如何使用CNN解决NLP问题。截止目前,我们学习了很多RNN模型来解决NLP问题,由于NLP是序列的问题,使用RNN这种循环神经网络是很符合直觉的,而且也取得了不错的效果。但是,由于RNN速度较慢,而且梯度消失问题比较严重,人们就想借用CV领域的CNN,看是否能解决NLP的问题。 我们在之前的博客中已经详细介绍过卷积神经网络CNN,这里不再详细介绍。下面我们以一篇paper中使用CNN对句子进行情感分类为例,简要介绍下怎样将CNN应用到NLP中。 上图是一个非常简单的CNN网络,用来对影评进行情感分类,输入是一个长度为7的句子,我们把每个词用长度为5的词向量来表示,则对于输入来说,得到了一个7×5的矩阵,这不就相当于一张图片了吗,后续操作就很像CV了。第二步,需要对输入“图片“进行卷积操作,请注意,虽然输入可以看做图片,但其本质上是“一维”的句子,所以我们设计卷积核大小时,卷积核的宽度要固定为5,保证卷积核能对完整的词向量进行操作。这里共设计了3个不同大小的卷积核,每种大小有2个卷积核,共6个卷积核。卷积操作完成之后得到了6个特征图,对每个特征图取max pooling再拼接起来,得到一个长为6的向量,这就是用CNN对句子抽取的特征向量。最后再接一个softmax进行二分类。 除了上图展示的CNN操作外,还有一些CNN操作有可能会用到: 卷积操作的stride=k,每k行一个group进行卷积,默认卷积操作是k=1 卷积操作的dilation=k,跨k行进行卷积,默认卷积操作是k=1 padding,上图卷积操作之后,feature map相比于输入维度变小了,如果要想保持维度不变,可对输入进行padding max/avg pooling over time,上图的max pooling即为max pooling over time,即对整个句子所有时间步的feature取max k-max pooling,对整个句子的所有时间步的feature取top-k的max值,同时保持feature的相对顺序不变,上述max pooling相当于1-max pooling local max pooling,stride=k,对每k个feature取max,这个和CV里默认的max pooling是一样的,CV里就是画一个框取max dropout=p,对于每个连接,随机以概率p丢弃,属于一种正则化技术,能有效增加模型的鲁棒性 skip connections,之前讲过很多次了,直连线路,没有中间商赚差价 batch normalization,对每次卷积操作的输出进行z-score标准化,使得均值为0,标准差为1,能有效增加模型的鲁棒性 卷积核大小为1×1的卷积,相当于卷积前后的feature map的全连接,但又比全连接的参数少,因为一个卷积核的参数是共享的 最后,给出我们目前所学的工具箱: 词袋模型:对于一个句子,简单的把所有词的词向量进行平均,也能取得不错的baseline效果 基于滑动窗口的模型:对于POS、NER等不需要很长的上下文信息的问题来说,效果不错 CNN:对分类问题效果很好,容易在GPU上并行,所以效率很高 RNN:对于NLP问题来说,符合认知,对分类问题效果不是很好(如果只用最后一个隐状态的话),加上Attention性能提升明显,特别适合序列标注、语言模型等序列问题

August 5, 2019 · 1 min

CS224N(2.7)Question Answering

这节课的内容比较简单,是问答系统(Question Answering, QA)的入门介绍。 QA简介 首先,为什么需要QA?目前各大搜索引擎对于一个查询,给出的都是一个结果列表。但是很多查询是一个问题,答案也往往比较确定,比如“现任美国总统是谁?”,此时,返回一堆结果列表就显得太过啰嗦了,尤其是在手机等移动设备上搜索时,简单的给出回答也许会更好一些。另一方面,智能手机上的助手如Siri、Google Now之类的,用户期望的也是简洁的答案,而不是一堆网页列表。 QA系统的组成主要有两个部分,一部分是根据问题检索到相关的文档,这部分是传统的信息检索的内容;另一部分是对检索到的文档进行阅读理解,抽取出能回答问题的答案,这部分就是本文要介绍的QA系统。 QA的历史可追溯到上世纪七十年代,但真正取得突破性进展也就是最近几年。2015/2016年,几个大规模QA标注数据集的发表,极大的推动了这个领域的发展。这其中比较有名的数据集是斯坦福大学发布的Stanford Question Answering Dataset (SQuAD)。 SQuAD数据集的每一个样例包含一段描述P,一个问题Q,以及对Q的人工标注答案A。为了使数据集更加鲁棒,对于每个问题,都给出了三个人工标注答案。每个答案都是描述P中的一小段文字,称为一个span。所以,问题相对来说比较简单,答案可以直接从描述中提取sub-sequence得到。 QA系统的评价指标有两个,一个是确定性匹配Exact match,即对于每个问题,模型给出的回答如果和3个答案中的任意一个完全匹配,则加1分,否则不加分。另一个是F1指标,使用词袋模型(不考虑词的顺序),对于每个问题,模型给出的回答和3个答案中的每一个计算F1,这个问题的F1是3个F1的最大值,最终得分是所有问题的F1打分的均值。Exact match和F1都不考虑标点符号和冠词。相对来说,F1比Exact match更可靠和鲁棒一些。 经过两年的两三年的刷榜,SQuAD数据集的最好性能已经超越了人类的性能,为了增加数据集的难度,斯坦福后续推出升级版本SQuAD 2.0。 由于1.1版本的问题都有答案,所以QA系统变成了一个排序系统,只需要把Answer列表中排名第一的结果输出就好了。2.0在1.1的基础上,增加了没有答案的问题,可以理解为假问题,对系统造成干扰。此时就要求系统判断这个问题能否从描述P中获得答案,如果没有答案的话,就不输出任何回答<No Answer>。对于没有答案的问题,如果系统没有输出答案,得1分,否则输出任何答案都得0分。 SQuAD数据集的局限性: 回答都是span-based类型的,没有yes/no、计数、why等的问答。 由于构造问题q的时候,已知了描述P,那么q和P的描述会很像,无论是用词还是语法。而搜索引擎面临的真实情况往往是,q根本不知道P是什么,有可能q和P的描述在行文及用词上有很大差别。 描述P比较简单,因为答案是一个span,所以模型把q和P匹配,找到可能的答案位置就行。实际的复杂场景有可能要综合好几个句子的信息,还要理解不同的指代关系等才能得出最终答案。 虽然SQuAD数据集还有不少局限性,但由于其是一个well-targeted、well-structured、clean dataset,在QA发展初期,还是为促进QA发展立下了汗马功劳。 Stanford Attentive Reader 下面介绍一下Chris Manning组针对SQuAD数据集开发的QA系统——Stanford Attentive Reader。该系统目前虽然不是最好性能,但它包含QA的基本模块,可以作为QA的一个baseline模型。 首先模型对问题q进行表征的方法如下,输入是q中每个词的词向量,然后使用一个Bi-LSTM提取句子特征,由于是双向的LSTM,所以模型把正向和反向的LSTM的最后一个隐状态拼接起来,作为对整个句子的表征。 由于SQuAD数据集的回答都是描述P中的一个span,那么,模型只需要预测出这个span在P中的起始位置和终止位置即可,具体方法如下图所示。其实也很简单,上一步我们得到的句子的表征向量q,下一步,我们对描述P也使用Bi-LSTM,得到描述P中每个词的表征向量\(\tilde p_i\)。然后,使用两次Attention,用q查询集合\(P=[\tilde p_1,…,\tilde p_n]\),得到答案span的起始位置\(\alpha_i\)和终止位置\(\alpha’_i\)。另外,由于\(q\)和\(\tilde p_i\)的维度可能不一样,又或者为了提升模型性能,在计算Attention score的时候,不是简单的向量点积,而是采用了线性变换的方法,增加了参数\(W\)。 后来,Chris Manning组又推出了升级版本Stanford Attentive Reader++,主要包括两个方面。首先,对表征问题的网络进行了改进,\(q\)不仅包含Bi-LSTM的两个尾结点的隐状态,而是包含整个问题所有隐状态的加权平均,而且网络层数增加到了3层。其次,对描述P的表征方面,原来的输入只包含词向量,现在还包含语言特征(如POS、NER的标签)、词频、以及近义词的相似度等。改进版模型性能提升了不少。 另一个比较流行的QA系统是BiDAF,如下图所示,这里不再详细介绍。它的特点一方面输入不仅包含词向量,还包含字符级别的特征。另一大创新是在Attention Flow Layer,相对于Stanford Attentive Reader,BiDAF的Attention是双向的,不但包含q对P的Attention,还包含P对q的Attention。

August 4, 2019 · 1 min

CS224N(1.31)Translation, Seq2Seq, Attention

今天介绍另一个NLP任务——机器翻译,以及神经网络机器翻译模型seq2seq和一个改进技巧attention。 机器翻译最早可追溯至1950s,由于冷战的需要,美国开始研制由俄语到英语的翻译机器。当时的机器翻译很简单,就是自动从词典中把对应的词逐个翻译出来。 后来在1990s~2010s,统计机器翻译(Statistical Machine Translation, SMT)大行其道。假设源语言是法语\(x\),目标语言是英语\(y\),机器翻译的目标就是寻找\(y\),使得\(P(y|x)\)最大,也就是下图的公式。进一步,通过贝叶斯公式可拆分成两个概率的乘积:其中\(P(y)\)就是之前介绍过的语言模型,最简单的可以用n-gram的方法;\(P(x|y)\)是由目标语言到源语言的翻译模型。为什么要把\(P(y|x)\)的求解变成\(P(x|y)*P(y)\)?逐个击破的意思,\(P(x|y)\)专注于翻译模型,翻译好局部的短语或者单词;而\(P(y)\)就是之前学习的语言模型,用来学习整个句子\(y\)的概率,专注于翻译出来的句子从整体上看起来更加通顺、符合语法与逻辑。所以问题就转化为怎样求解\(P(x|y)\)。 SMT进一步把\(P(x|y)\)分解成\(P(x,a|y)\),其中\(a\)表示一个对齐alignment,可以认为是两种语言之间单词和单词或短语和短语的一个对齐关系。如下图所示是一个英语和法语的alignment。对齐本身就很复杂,存在1对1,1对多,多对1,多对多等情况,所以\(P(x,a|y)\)的求解在给定\(y\)的情况下,不但要考虑对齐方案\(a\)的情况\(P(a|y)\),还需要考虑对齐之后词与词的翻译情况\(P(x|a,y)\),可能的情况非常多。 那么,SMT怎样找到\(\arg max_y\)呢?穷举所有情况是不可能的,启发式搜索是可行的。形象描述就是在搜索过程中,对概率较低的路径进行剪枝,只保留概率较大的翻译情况。如下图的搜索树,对于概率较低的路径就不往下搜索了。 总之,统计机器翻译非常复杂,有很多的子模块,需要很多的人工干预和特征工程。 2014年,seq2seq模型横空出世,神经网络机器翻译(Neural Machine Translation, NMT)方兴未艾。seq2seq顾名思义,就是从序列到序列的模型,因为机器翻译的源语言和目标语言都是seq。 seq2seq的NMT如下图所示,它由两个RNN组成,左边的红色部分称为Encoder RNN,它负责对源语言进行编码(Encode);右边的绿色部分称为Decoder RNN,它负责对目标语言进行解码(Decode)。首先,Encoder RNN可以是任意一个RNN,比如朴素RNN、LSTM或者GRU。Encoder RNN负责对源语言进行编码,学习源语言的隐含特征。Encoder RNN的最后一个神经元的隐状态作为Decoder RNN的初始隐状态。Decoder RNN是一个条件语言模型,一方面它是一个语言模型,即用来生成目标语言的;另一方面,它的初始隐状态是基于Encoder RNN的输出,所以称Decoder RNN是条件语言模型。Decoder RNN在预测的时候,需要把上一个神经元的输出作为下一个神经元的输入,不断的预测下一个词,直到预测输出了结束标志符<END>,预测结束。Encoder RNN的输入是源语言的word embeding,Decoder RNN的输入是目标语言的word embeding。 seq2seq是一个很强大的模型,不但可以用来做机器翻译,还可以用来做很多NLP任务,比如自动摘要、对话系统等。 seq2seq作为一个条件语言模型,形式化来说,它直接对\(P(y|x)\)进行建模,在生成\(y\)的过程中,始终有\(x\)作为条件,正如下图的条件概率所示。 上面介绍了seq2seq的预测过程,seq2seq的训练过程如下图所示。训练的时候,我们同时需要源语言和翻译好的目标语言,分别作为Encoder RNN和Deocder RNN的输入。对于Encoder RNN没什么好说的。Decoder RNN在训练阶段,每一个时间步的输入是提供的正确翻译词,输出是预测的下一个时间步的词的概率分布,比如在\(t=4\),预测输出是\(\hat y_4\),而正确答案是“with”,根据交叉熵损失函数,\(J_4=-\log P(“with”)\)。总的损失函数就是所有时间步的损失均值。 seq2seq的训练过程是end2end的,即把Encoder RNN和Decoder RNN作为一个整体进行训练,不会像SMT一样有很多的子模块单独训练。当然seq2seq也可以单独对encoder和deconder进行训练优化,再组合,但是这个效果不一定会比整体优化encoder和deconder更好。 上上张图介绍的seq2seq的预测过程,实际上是一个贪心的预测过程,即在Decoder RNN的每一步都贪心选择\(\hat y_t\)概率最大的那个词。但是贪心只能保证每一步是最优的,无法保证预测出来的句子整体是最优的。特别是如果在\(t\)时刻贪心选择的词不是全局最优,会导致\(t\)时刻往后的所有预测词都是错误的,没有回头路了。但是如果每个时间步都穷举所有可能的情况的话,时间复杂度\(O(V^T)\)又太高了。 Beam search搜索策略是贪心策略和穷举策略的一个折中方案,它在预测的每一步,都保留Top-k高概率的词,作为下一个时间步的输入。k称为beam size,k越大,得到更好结果的可能性更大,但计算消耗也越大。请注意,这里的Top-k高概率不仅仅指当前时刻的\(\hat y_t\)的最高概率,而是截止目前这条路径上的累计概率之和,如下图的公式所示。 举例如下,假设\(k=2\),第一个时间步保留Top-2的词为”he”和”I”,他们分别作为下一个时间步的输入。”he”输入预测输出前两名是”hit”和”struck”,则”hit”这条路的累加概率是”he”的概率加上”hit”的概率=-1.7,类似的可以算出其他几个词对应路径的概率打分。最后在这4条路上保留\(k=2\)条路,所以”hit”和”was”对应路径保留,作为下一个时间步的输入;”struck”和”got”对应路径被剪枝。 最终的搜索树如下图所示,可以看到在每个时间步都只保留了\(k=2\)个节点往下继续搜索。最后”pie”对应的路径打分最高,通过回溯法得到概率最高的翻译句子。请注意,beam search作为一种剪枝策略,并不能保证得到全局最优解,但它能以较大的概率得到全局最优解,同时相比于穷举搜索极大的提高了搜索效率。 在beam search的过程中,不同路径预测输出结束标志符<END>的时间点可能不一样,有些路径可能提前结束了,称为完全路径,暂时把这些完全路径放一边,其他路径接着beam search。beam search的停止条件有很多种,可以设置一个最大的搜索时间步数,也可以设置收集到的最多的完全路径数。 当beam search结束时,需要从n条完全路径中选一个打分最高的路径作为最终结果。由于不同路径的长度不一样,而beam search打分是累加项,累加越多打分越低,所以需要用长度对打分进行归一化,如下图所示。那么,为什么不在beam search的过程中就直接用下面的归一化打分来比较呢?因为在树搜索的过程中,每一时刻比较的两条路径的长度是一样的,即分母是一样的,所以归一化打分和非归一化打分的大小关系是一样的,即在beam search的过程中就没必要对打分进行归一化了。 ...

August 2, 2019 · 1 min

CS224N(1.29)Vanishing Gradients, Fancy RNNs

梯度消失 今天介绍RNN的梯度消失问题以及为了解决这个问题引出的RNN变种,如LSTM何GRU。 在上一篇博客中,通过公式推导,我们已经解释了RNN为什么容易产生梯度消失或梯度爆炸的问题,核心问题就是RNN在不同时间步使用共享参数\(W\),导致\(t+n\)时刻的损失对\(t\)时刻的参数的偏导数存在\(W\)的指数形式,一旦\(W\)很小或很大就会导致梯度消失或梯度爆炸的问题。下图形象的显示了梯度消失的问题,即梯度不断反传,梯度不断变小(箭头不断变小)。 梯度消失会带来哪些问题呢?一个很明显的问题就是参数更新更多的受到临近词的影响,那些和当前时刻\(t\)较远的词对当前的参数更新影响很小。如下图所示,\(h^{(1)}\)对\(J^{(2)}(\theta)\)的影响就比对\(J^{(4)}(\theta)\)的影响大。久而久之,因为梯度消失,我们就不知道\(t\)时刻是真的对\(t+n\)时刻没影响还是因为梯度消失导致我们没学习到这种影响。 下图是一个更形象的例子,假设我们需要预测句子The writer of the books下一个单词,由于梯度消失,books对下一个词的影响比writer对下一个词的影响更大,导致模型错误的预测成了are,但这显然是不对的。 类似的,如果梯度爆炸,则根据梯度下降的更新公式,参数会一瞬间更新非常大,导致网络震荡,甚至出现Inf或NaN的情况。 梯度爆炸一个比较好的解决方法是梯度裁剪,即如果发现梯度的范数大于某个阈值,则以一定的比例缩小梯度的范数,但不改变其方向。如下下图所示,左子图是没有梯度裁剪的情况,由于RNN的梯度爆炸问题,导致快接近局部极小值时,梯度很大,参数突然爬上悬崖,然后又飞到右边一个随机的区域,miss掉了中间的局部极小值。右子图是增加了梯度裁剪之后,更新步伐变小,参数稳定在局部极小值附近。 总的来说,梯度爆炸相对好解决,但梯度消失就没那么简单了。在RNN中,每个时刻\(t\),都改写了前一个时刻的隐状态,而由于梯度消失问题,长距离以前的状态对当前时刻的影响又很小,所以导致无法建模长距离依赖关系。那么,如果把每个时刻的状态单独保存起来,是否能解决长距离依赖问题呢? LSTM LSTM就是这样一个思路,请大家结合如下两幅图来理解: (下图)首先,从宏观上来说,LSTM的隐层神经元不仅包含隐状态\(h_t\),还专门开辟了一个cell来保存过去的“记忆”\(c_t\),LSTM希望用\(c_t\)来传递很久以前的信息,以达到长距离依赖的目的。所以LSTM隐层神经元的输入是上一时刻的隐状态\(h_{t-1}\)和记忆\(c_{t-1}\),输出是当前时刻的隐状态\(h_t\)和希望传递给下一个时刻的记忆\(c_t\)。 (上图)每个时刻\(t\),为了调控遗忘哪些记忆,写入哪些新记忆,LSTM设置了两个门,分别是遗忘门\(f^{(t)}\)和写入门\(i^{(t)}\)。它们都是上一时刻的隐状态\(h^{(t-1)}\)和当前时刻的输入\(x^{(t)}\)的函数。\(f^{(t)}\)控制遗忘哪些记忆,即\(f^{(t)}\circ c^{(t-1)}\);\(i^{(t)}\)控制写入哪些新记忆,即\(i^{(t)}\circ \tilde c^{(t)}\),其中\(\tilde c^{(t)}\)即为期望写入的新记忆,它也是\(h^{(t-1)}\)和\(x^{(t)}\)的函数。最终,新时刻\(t\)的记忆就是这两部分的组合,请看上图\(c^{(t)}\)表达式。 (上图)输出门\(o^{(t)}\)控制哪些记忆需要输出到下一个隐状态\(h^{(t)}\),\(o^{(t)}\)自己又是\(h^{(t-1)}\)和\(x^{(t)}\)的函数。 大家结合上图的公式和下图的示意图就不难理解了。 LSTM解决梯度消失最直接的方法就是,遗忘门选择不遗忘,每一时刻的\(f^{(t)}\)都选择记住前一时刻的记忆\(c^{(t-1)}\),然后直接传递给下一时刻。那么,所有前\(t-1\)时刻的记忆都会被完整的传递给第\(t\)时刻,从而对\(t\)时刻的输出产生影响。 而朴素RNN无法保存前期状态的原因就是因为朴素RNN把之前时间步的信息都一股脑存储在隐状态\(h^{(t)}\)中了,隐状态\(h^{(t)}\)成为了整个网络的瓶颈,一旦出现梯度消失,则很久以前的信息对当前时刻的影响就微乎其微了。LSTM的关键就是开辟了一个新的cell来存储记忆,这个新的cell相当于记忆的一条捷径,时刻\(t\)除了可以像常规RNN一样通过\(h^{(t-1)}\)来获取很久以前的信息,还可以通过cell存储的记忆\(c^{(t-1)}\)来便捷地获取到很久以前的信息,所以隐状态\(h^{(t)}\)不再成为整个网络的瓶颈,有新的cell来分担。 需要提醒的是,虽然LSTM开辟新的cell来存储记忆,但这个记忆也会受到连续梯度相乘的影响,所以依然存在梯度消失或梯度爆炸的问题,但从实际效果来看,LSTM性能很不错,也很鲁棒。 GRU 另一种能缓解RNN梯度消失的网络——GRU。为了简化LSTM,GRU又没有cell了,但依然保留了门来控制信息的传递。首先看下图最后一个公式,当前时刻的隐状态\(h^{(t)}\)等于上一时刻的隐状态\(h^{(t-1)}\)和新写入的隐状态\(\tilde h^{(t)}\)的加权平均,通过更新门\(u^{(t)}\)来控制它们之间的比例,\(u^{(t)}\)是上一时刻的隐状态\(h^{(t-1)}\)和当前时刻的输入\(x^{(t)}\)的函数。新写入的隐状态\(\tilde h^{(t)}\)又通过一个重置门\(r^{(t)}\)来控制,类似的,\(r^{(t)}\)也是\(h^{(t-1)}\)和\(x^{(t)}\)的函数。 个人觉得,GRU中的更新门\(u^{(t)}\)类似于LSTM中的输出门\(o^{(t)}\);GRU中的重置门\(r^{(t)}\)类似于LSTM中的遗忘门\(f^{(t)}\)和写入门\(i^{(t)}\)的组合;GRU中新写入的隐状态\(\tilde h^{(t)}\)类似于LSTM中的细胞记忆\(c^{(t)}\)。所以,可以把GRU看作LSTM的简化版本。 直观来说,GRU和LSTM类似,解决梯度消失的策略就是新增\(u^{(t)}\)来控制\(h^{(t-1)}\)和\(\tilde h^{(t)}\)的比例,如果\(u^{(t)}=0\),则\(h^{(t)}=h^{(t-1)}\),即\(t\)时刻的隐状态和上一时刻的隐状态相同,虽然这肯定效果不好,但至少说明GRU是有能力保留之前的隐状态的。 GRU和LSTM的性能差不多,但GRU参数更少,更简单,所以训练效率更高。但是,如果数据的依赖特别长且数据量很大的话,LSTM的效果可能会稍微好一点,毕竟参数量更多。所以默认推荐使用LSTM。 其他缓解梯度消失的策略 由于链式法则,或者所选非线性激活函数的原因,不仅仅RNN,所有神经网络都存在梯度消失或者梯度爆炸的问题,比如全连接网络和CNN。一些通用解决方法如下: ResNet。因为梯度是在传递的过程中逐渐减小并消失的,如果跨越好几层直接进行连接,天然能保持远距离信息。个人理解,这就相当于买家和卖家直接相连,没有中间商赚差价\(\mathcal F(x)\),买到的价格最接近卖出的价格\(x\)。能一定程度上减弱梯度消失的问题。 更激进的是DenseNet,把跨越多层之间的很多神经元都连起来,也就是说有更多的线路没有中间商赚差价,进一步减弱梯度消失问题。 HighwayNet。借鉴了LSTM和GRU的思路,不是像ResNet一样直接新增一条直连线路\(x\),而是搞一个平衡因子\(u\),卖家到买家的价格由\(u\)进行调和平均:\(u*\mathcal F(x)+(1-u)*x\),用\(u\)来控制多少走中间商,多少走直连线路。 虽然所有神经网络都存在梯度消失的问题,但RNN的这个问题更严重,因为它连乘的是相同的权重矩阵W,而且RNN针对的是序列问题,往往更深。 双向RNN 假设我们在对句子进行情感分类,如下图所示。对于terribly这个词,常规RNN,terribly的梯度只能看到左边的信息,看不到右边的信息,因为网络是从左到右的。单独看terribly或者从左往右看,在没有看到exciting时,可能认为terribly是贬义词,但是如果跟右边的exciting结合的话,则意思变为强烈的褒义词,所以有必要同时考虑左边和右边的信息。 双向RNN包含两个RNN,一个从左往右,一个从右往左,两个RNN的参数是独立的。最后把两个RNN的输出拼接起来作为整体输出。那么,对于terribly这个词,它的梯度能同时看到左边和右边的信息。 由于双向RNN对于某个时刻\(t\),既需要知道\(t\)时刻前的信息(Forward RNN),又需要知道\(t\)时刻之后的信息(Backward RNN),所以双向RNN无法用于学习语言模型,因为语言模型只知道时刻\(t\)之前的信息,下一时刻的词需要模型来预测。对于包含完整序列的NLP问题,双向RNN应该是默认选择,它通常比单向RNN效果更好。 多层RNN 前面展示的RNN从时间\(t\)的维度上来说可以认为是多层的,但是RNN还可以从另一个维度来增加层数。如下图所示,将上一层(RNN layer 1)的输出作为下一层(RNN layer 2)的输入,不断堆叠下去,变成一个多层RNN。通常来说,深度越大,性能越好,如果梯度下降能训练好的话。 RNN的层数通常不会很深,不会像CNN一样,达到上百层,RNN通常2层,最多也就8层。一方面是RNN的梯度消失问题比较严重,另一方面是RNN训练的时候是串行的,不易并行化,导致网络太深的话训练很花时间。 ...

August 1, 2019 · 1 min

CS224N(1.24)Language Models and RNNs

今天要介绍一个新的NLP任务——语言模型(Language Modeling, LM),以及用来训练语言模型的一类新的神经网络——循环神经网络(Recurrent Neural Networks, RNNs)。 语言模型就是预测一个句子中下一个词的概率分布。如下图所示,假设给定一个句子前缀是the students opened their,语言模型预测这个句子片段下一个词是books、laptops、exams、minds或者其他任意一个词的概率。形式化表示就是计算概率 $$\begin{eqnarray}P(x^{(t+1)}|x^{(t)},…,x^{(1)})\tag{1}\end{eqnarray}$$\(x^{(t+1)}\)表示第\(t+1\)个位置(时刻)的词是\(x\),\(x\)可以是词典\(V\)中的任意一个词。 既然语言模型在给定前t个词之后可以预测第t+1个词的概率,那么预测到第t+1个词之后,又可以递归的根据前t+1个词预测第t+2个词,如此不断的进行下去,就可以预测一整个句子的概率了。所以,也可以把语言模型看做一个可以计算一个句子出现的概率的系统,形式化表示就是如果一个句子是\(x^{(1)},…,x^{(T)}\) ,那么语言模型可以计算句子概率 $$\begin{eqnarray}P(x^{(1)},…,x^{(T)})& = & P(x^{(1)})\times P(x^{(2)}|x^{(1)})\times…\times P(x^{(T)}|x^{(T-1)},…,x^{(1)}) \tag{2}\\& = & \prod_{t=1}^T P(x^{(t)}|x^{(t-1)},…,x^{(1)})\tag{3}\end{eqnarray}$$可以看到(3)式连乘的项就是(1)式,所以这两个定义的内涵是一样的。 那么语言模型有什么用呢?它的用处可大了,比如现在的输入法会根据前一个输入的词预测下一个将要输入的词,此所谓智能输入法;比如在百度或谷歌搜索时,输入前几个关键词,搜索引擎会自动预测接下来可能的几个词;比如网上有很多智能AI会自动生成新闻、诗歌;还比如用在语音识别、机器翻译、问答系统等等。可以说语言模型是很多NLP任务的基础模块,具有非常重要的作用。 在前-深度学习时代,人们使用n-gram方法来学习语言模型。对于一个句子,n-gram表示句子中连续的n个词,比如还是上图的例子,n-gram对于n=1,2,3,4的结果是: 1-grams (unigrams): “the”, “students”, “opened”, “their” 2-grams (bigrams): “the students”, “students opened”, “opened their” 3-grams (trigrams): “the students opened”, “students opened their” 4-grams: “the students opened their” n-gram方法有一个前提假设,即假设每个词出现的概率只和前n-1个词有关,比如2-gram对于每个词出现的概率只和前面一个词有关,和更前面的词以及后面的词都没有关系,所以我们有如下图的assumption。又这是一个条件概率,展开之后得到如下除法的形式。n-gram的计算方法就是,统计语料库中出现\(x^{(t)},…,x^{(t-n+2)}\)的次数(分母),以及在这个基础上再接一个词\(x^{(t+1)}\)的次数\(x^{(t+1)},x^{(t)},…,x^{(t-n+2)}\)(分子),用后者除以前者来近视这个条件概率。 举个例子,假设完整的句子是as the proctor started the clock, the students opened their,需要预测下一个词的概率分布。对于4-gram方法,则只有students opened their对下一个词有影响,前面的词都没有影响。然后我们统计训练集语料库中发现,分母students opened their出现1000次,其后接books即students opened their books出现了400次,所以P(books|students opened their)=400/1000=0.4。类似的,可以算出下一个词为exams的概率是0.1。所以4-gram方法认为下一个词是books的概率更大。 ...

July 31, 2019 · 2 min