谷葆春
(北京信息科技大學 計算機學院,北京 100101)
對于大多數(shù)中小投資者來說,由于信息獲取的滯后性和非系統(tǒng)性,在和專業(yè)機構、游資以及很多量化資金的較量中,經常成為被收割的對象,難以獲取滿意的收益。因為在投資市場公司數(shù)量眾多,散戶的精力有限,缺少投研能力,因此沒辦法做到了解和熟悉大部分公司的基本面。
美國的AlphaSense公司已經開發(fā)出新一代的金融知識引擎系統(tǒng),它可以從新聞、財報各種行業(yè)網站等獲取大量數(shù)據、信息、知識形式的“素材”,然后通過自己的邏輯和世界觀將這些素材組織成投資決策。國內目前還沒有類似的系統(tǒng),因此本文為中小投資者提供了一種在短時間內獲取公司較多有價值投資信息的方法。
使用Seq2Seq深度學習模型,可以通過在Encoder端輸入新聞、財報、公告和研報等數(shù)據,在Decoder端輸出相關重要信息的摘要,從而為投資者節(jié)省大量的時間,并為他們的買入和賣出提供輔助決策。
文本摘要是對特定的文本信息,實現(xiàn)抽取或概括其主要含義,同時能保留原文本重要內容的一種文本生成任務。文本摘要技術一方面能對文本進行簡潔、準確的總結,節(jié)省用戶閱讀和獲取信息的時間,另一方面?zhèn)鬟_了原文內的主要內容,保證了用戶獲得信息的有效性。
摘要分為抽取式和生成式兩種。抽取式摘要主要從文中選取跟中心思想最接近的一個或幾個句子,組成最后的摘要;而生成式摘要則是在理解原文內容的基礎上,用自己的語言概括原文的核心思想,從而達到生成最后摘要的目的。
(1)早期的LSTM方法;
(2)早期的Encoder-Decoder模型,如lstm2lstm;
(3)Seq2Seq + Attention模型;
(4)Self-Attention和Transformer,自注意力機制;
(5)預訓練+微調,例如Bert與PreSumm等。
近兩年雖然Bert模型在許多摘要任務中有著較為出色的表現(xiàn),但Seq2Seq + Attention模型仍然有自己的應用場景。考慮到普通用戶的資源情況,本文采取Seq2Seq + Attention模型實現(xiàn)相關金融數(shù)據的摘要處理方式。
Seq2Seq即Sequence to Sequence,也就是序列到序列的意思,模型結構如圖1所示。在文本摘要中輸入序列為新聞或財報等原文,而輸出序列為生成的原文摘要。Seq2Seq模型拼接了兩個RNN系統(tǒng)的模型,分別稱為模型的編碼器Encoder部分和解碼器Decoder部分。Encoder將變長源序列映射為定長語義向量并組合在一起,而Decoder將該向量映射回變長目標序列。
圖1 Seq2Seq模型
給定輸入序列=(,,…,),編碼器將其轉換成一個向量:
=(,,…,)
(1)
=(,-1)
(2)
是時刻的隱層狀態(tài),由當前輸入和上一個單元的輸出共同決定,是由整個序列的隱層向量得到的向量表示,由最后一個編碼器輸出,是解碼器從編碼器接收的唯一信息。
解碼可以看作編碼的逆過程,根據給定的語義向量和之前已經生成的輸出序列,,…,-1來預測下一個輸出的單詞。
=argmax()=
(3)
(|,,…,-1,)=(-1,,)
(4)
表示時刻預測的結果,是解碼器Decoder的隱藏層。
Encoder-Decoder模型很經典,但其局限性在于編碼和解碼之間的唯一聯(lián)系是固定長度的語義向量,即編碼器要將整個序列的信息壓縮進一個固定長度的向量中。這有兩個弊端,一是語義向量無法完全表示整個序列的信息,壓縮損失了一定的數(shù)據。二是先輸入的內容攜帶的信息會被后輸入的信息稀釋掉。輸入序列越長,問題越嚴重。這樣在解碼的時候一開始沒有獲得輸入序列足夠的信息,解碼時準確率也會打一定折扣。
為了解決上述問題,Attention模型被提出。Attention模型在輸出的時候,產生一個注意力范圍表示接下來輸出時重點關注的輸入序列部分,再根據關注的區(qū)域來產生下一個輸出,如此反復。Attention模型增加了模型的訓練難度,但它提升了文本生成的效果。
在解碼時,由提示當前輸出對應的源序列的隱層狀態(tài),而不是在每步解碼中都用同一個語義向量,用表示每步使用的語義向量后如下:
p(|,,…,-1,)=(-1,,)
(5)
=(-1,-1,)
(6)
其中,為某一步解碼時的隱層狀態(tài),引入了相應信息,為激活函數(shù)。
代表對源序列信息的注意力,對不同輸入的隱層狀態(tài)分配不同的權重,由于輸入輸出序列往往長度不相同,此步還起到了對齊作用,整個構成了一個alignment model,定義():
(7)
其中為解碼階段的第步,為源序列的第個輸入。
引入注意力機制后,輸入的隱層狀態(tài)不再經過整個源序列編碼過程的傳遞,而直接作用于語義向量,減少了信息損失。
的定義為:
(8)
一個softmax層可以將歸一化為,是注意力得分,即量化輸入的隱層狀態(tài)被第個輸出分配的注意力,定義為:
=tan(-1+)
(9)
其中,tan為激活函數(shù),是將輸入輸出隱層狀態(tài)進行線性組合的注意力得分計算方式,另外還有dot product等不同的設計,但最終是都為了讓相關輸入的隱層狀態(tài)與當前輸出的隱層狀態(tài)有更高的得分。
擁有更高注意力得分的輸入,在語義向量的計算中有更高權重,從而為當前輸出的引入了主要的信息,解碼過程的語義向量不再是無差別,而是基于源序列與目標序列的依賴關系建模得到。
模型訓練時,通過反向傳播讓輸出更接近結果,更新隱層狀態(tài)與注意力函數(shù)的參數(shù)。
總而言之,通過訓練,注意力機制可以對關系較大的輸入輸出賦以較大權重(兩者在轉換中對齊的概率更大),對位置信息進行了建模,從而減少了信息損失,能專注于更重要的信息進行序列預測。
step_1:數(shù)據預處理
數(shù)據集采用的是網上的新浪微博數(shù)據,每篇文章由正文和標題組成,標題作為正文數(shù)據的摘要,總數(shù)量為45萬個樣本,選取其中的40萬個數(shù)據作為訓練數(shù)據。每篇正文平均字數(shù)為45個字,字數(shù)標準差為11,最多字數(shù)為513,最少字數(shù)為14。標題平均字數(shù)為11個字,字數(shù)標準差為3,最多字數(shù)為34,最少字數(shù)為2。
使用jieba分詞器對正文和標題數(shù)據進行分詞操作,然后在正文中去掉停用詞,標題中的停用詞則不用去除,因為去掉停用詞之后,標題的意思會變得不連貫。
對標題數(shù)據加上開始標記“GO”和結束標記“EOS”。對長度不同的正文數(shù)據,以最長長度為基準,長度不足的填充數(shù)據“PAD”。
step_2:使用詞向量
使用維基百科中文詞向量實現(xiàn)中文詞匯到向量的映射,該詞向量表有35萬個詞語。有些詞語沒有出現(xiàn)在該表中,則對這些詞語(UNK)需要單獨構造詞向量。
正文中如果有過多的UNK,或是長度超過設置的最大長度(80),則該數(shù)據會被去除。因為過長的正文數(shù)據會造成生成的摘要效果不佳。
step_3:建立模型
先構造基本LSTM單元,其隱層結點的數(shù)量為256個,后面接一個dropout層。采用雙向RNN網絡,把2層LSTM基本網絡堆疊在一起,形成編碼Encoder層。雙向RNN網絡是當前的輸出除了與前面的序列有關系,與后面的序列也有關系的網絡形式。
對于Decoder層的構造,首先是把sequence_length等參數(shù)傳進來,然后同樣構造2層RNN網絡,在訓練時,直接將標題數(shù)據作為輸入,而不是將上一步的結果作為輸入。而在測試時,則使用上一步的結果作為輸入。
step_4:訓練模型
指定好Scope域,保證訓練好的權重參數(shù),可以在測試時重復使用。訓練的各項參數(shù)分別是每次的batch_size為64,學習率為0.0005。損失函數(shù)采用tensorflow的sequence_loss判斷預測結果與目標值是否一致。
step_5:測試數(shù)據及結果評測
測試時,首先恢復之前的Seq2Seq模型,讀取保存的session,輸入測試數(shù)據,測試數(shù)據采用樣本數(shù)據中剩下的5萬個數(shù)據,將網絡前向傳播執(zhí)行一次,最后生成的摘要數(shù)據保存在摘要文件中。中文文本摘要采用LawRouge評價器,它支持Rouge-1、Rouge-2以及Rouge-L三種評價。使用files_rouge.get_scores方法對模型輸出摘要文件列表和參考摘要文件列表進行評價,再用三個評價的加權平均作為最終評價:0.2*scores['rouge-1']['f']+ 0.4*scores['rouge-2']['f']+ 0.4*scores['rouge-l']['f']。 最后的結果為0.8949,生成的摘要結果滿足了用戶的需求。
對于投資者來說,及時、準確地獲取公司基本面和消息面的信息,才能對股票等投資標的下一步的走勢和節(jié)奏進行合理的判斷。本文采用Seq2Seq + Attention模型,對公司新聞、研報和財報等信息實現(xiàn)自動摘要生成,總體結果令人滿意。后續(xù)的改進方向是能形成自己的邏輯和世界觀,從而將這些素材組織成投資決策,對于摘要的準確性提高則可以考慮結合Bert模型。