001_卷積神經(jīng)網(wǎng)絡(luò)在自然語言處理的應(yīng)用

卷積神經(jīng)網(wǎng)絡(luò)在自然語言處理的應(yīng)用

轉(zhuǎn)自:http://www.csdn.net/article/2015-11-11/2826192

摘要:CNN作為當今絕大多數(shù)計算機視覺系統(tǒng)的核心技術(shù),在圖像分類領(lǐng)域做出了巨大貢獻。本文從計算機視覺的用例開始,介紹CNN及其在自然語言處理中的優(yōu)勢和發(fā)揮的作用。

當我們聽到卷積神經(jīng)網(wǎng)絡(luò)(Convolutional?Neural?Network,?CNNs)時,往往會聯(lián)想到計算機視覺。CNNs在圖像分類領(lǐng)域做出了巨大貢獻,也是當今絕大多數(shù)計算機視覺系統(tǒng)的核心技術(shù),從Facebook的圖像自動標簽到自動駕駛汽車都在使用。

最近我們開始在自然語言處理(Natural?Language?Processing)領(lǐng)域應(yīng)用CNNs,并取得了一些引人注目的成果。我將在本文中歸納什么是CNNs,怎樣將它們應(yīng)用于NLP。CNNs背后的直覺知識在計算機視覺的用例里更容易被理解,因此我就先從那里開始,然后慢慢過渡到自然語言處理。

什么是卷積運算?

對我來說,最容易的理解方式就是把卷積想象成作用于矩陣的一個滑動窗口函數(shù)。這么說有些拗口,但是用動畫顯示就很直觀了。

3x3的濾波器做卷積運算。圖片來源:

http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

把左側(cè)的矩陣想象成一幅黑白圖像。每一個元素對應(yīng)一個像素點,0表示黑點,1表示白點(灰度圖的像素值一般是0~255)。移動窗口又稱作核、濾波器或是特征檢測器。這里我們使用3x3的濾波器,將濾波器與矩陣對應(yīng)的部分逐元素相乘,然后求和。我們平移窗口,使其掃過矩陣的所有像素,對整幅圖像做卷積運算。

你也許有些疑惑,剛才的操作究竟會有什么效果呢。我們就來看幾個直觀的例子。

用鄰近點像素值的均值替換其原值,實現(xiàn)圖像模糊的效果:

用鄰近點像素值與自身的差值替換其原值,實現(xiàn)邊緣檢測的效果:

(為了直觀地來理解,想想圖像中平滑的那些部分,那些像素點與周圍像素的顏色幾乎一致:求和的結(jié)果趨近于0,相當于黑色。如果有一條明顯的邊緣線,比如黑白分界線,那么像素值的差值將會很大,相當于白色)

GIMP手冊里還有一些其它的例子。想要深入了解卷積運算的原理,我推薦閱讀Chris?Olah寫的專題博客

什么是卷積神經(jīng)網(wǎng)絡(luò)?

現(xiàn)在你明白了什么是卷積運算了吧。那CNNs又是什么呢?CNNs本質(zhì)上就是多層卷積運算,外加對每層的輸出用非線性激活函數(shù)做轉(zhuǎn)換,比如用ReLUtanh在傳統(tǒng)的前饋神經(jīng)網(wǎng)絡(luò)中,我們把每個輸入神經(jīng)元與下一層的輸出神經(jīng)元相連接。這種方式也被稱作是全連接層,或者仿射層。在CNNs中我們不這樣做,而是用輸入層的卷積結(jié)果來計算輸出。這相當于是局部連接,每塊局部的輸入?yún)^(qū)域與輸出的一個神經(jīng)元相連接。對每一層應(yīng)用不同的濾波器,往往是如上圖所示成百上千個,然后匯總它們的結(jié)果。這里也涉及到池化層(降采樣),我會在后文做解釋。在訓(xùn)練階段,CNN基于你想完成的任務(wù)自動學(xué)習(xí)濾波器的權(quán)重值。舉個例子,在圖像分類問題中,第一層CNN模型或許能學(xué)會從原始像素點檢測到一些邊緣線條,然后根據(jù)邊緣線條在第二層檢測出一些簡單的形狀,然后基于這些形狀檢測出更高級的特征,比如臉部輪廓等。最后一層是利用這些高級特征的一個分類器。

這種計算方式有兩點值得我們注意:位置不變性和組合性。比如說你想對圖片中是否包含大象做分類。因為濾波器是在全圖范圍內(nèi)平移,所以并不用關(guān)心大象究竟在圖片的什么位置。事實上,池化也有助于平移、旋轉(zhuǎn)和縮放的不變性,它對克服縮放因素的效果尤其好。第二個關(guān)鍵因素是(局部)組合性。每個濾波器對一小塊局部區(qū)域的低級特征組合形成更高級的特征表示。這也是CNNs對計算機視覺作用巨大的原因。我們可以很直觀地理解,線條由像素點構(gòu)成,基本形狀又由線條構(gòu)成,更復(fù)雜的物體又源自基本的形狀。

那么,如何將它們用于NLP呢?

NLP任務(wù)的輸入不再是像素點了,大多數(shù)情況下是以矩陣表示的句子或者文檔。矩陣的每一行對應(yīng)于一個分詞元素,一般是一個單詞,也可以是一個字符。也就是說每一行是表示一個單詞的向量。通常,這些向量都是word?embeddings(一種底維度表示)的形式,如word2vecGloVe,但是也可以用one-hot向量的形式,也即根據(jù)詞在詞表中的索引。若是用100維的詞向量表示一句10個單詞的句子,我們將得到一個10x100維的矩陣作為輸入。這個矩陣相當于是一幅“圖像”。

在計算機視覺的例子里,我們的濾波器每次只對圖像的一小塊區(qū)域運算,但在處理自然語言時濾波器通常覆蓋上下幾行(幾個詞)。因此,濾波器的寬度也就和輸入矩陣的寬度相等了。盡管高度,或者區(qū)域大小可以隨意調(diào)整,但一般滑動窗口的覆蓋范圍是2~5行。綜上所述,處理自然語言的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)是這樣的(花幾分鐘時間理解這張圖片,以及維度是如何變化的。你可以先暫時忽略池化操作,我們在稍后會解釋它):

用于句子分類器的卷積神經(jīng)網(wǎng)絡(luò)(CNN)結(jié)構(gòu)示意圖。這里我們對濾波器設(shè)置了三種尺寸:2、3和4行,每種尺寸各有兩種濾波器。每個濾波器對句子矩陣做卷積運算,得到(不同程度的)特征字典。然后對每個特征字典做最大值池化,也就是只記錄每個特征字典的最大值。這樣,就由六個字典生成了一串單變量特征向量(univariate?feature?vector),然后這六個特征拼接形成一個特征向量,傳給網(wǎng)絡(luò)的倒數(shù)第二層。最后的softmax層以這個特征向量作為輸入,用其來對句子做分類;我們假設(shè)這里是二分類問題,因此得到兩個可能的輸出狀態(tài)。來源:Zhang,?Y.,?&?Wallace,?B.?(2015).?A?Sensitivity?Analysis?of?(and?Practitioners’?Guide?to)?ConvolutionalNeural?Networks?for?Sentence?Classification.

計算機視覺完美的直觀感受這里還存在嗎?位置不變性和局部組合性對圖像來說很直觀,但對NLP卻并非如此。你也許會很在意一個詞在句子中出現(xiàn)的位置。相鄰的像素點很有可能是相關(guān)聯(lián)的(都是物體的同一部分),但單詞并不總是如此。在很多種語言里,短語之間會被許多其它詞所隔離。同樣,組合性也不見得明顯。單詞顯然是以某些方式組合的,比如形容詞修飾名詞,但若是想理解更高級特征真正要表達的含義是什么,并不像計算機視覺那么明顯了。

由此看來,卷積神經(jīng)網(wǎng)絡(luò)似乎并不適合用來處理NLP任務(wù)。遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent?Neural?Network)更直觀一些。它們模仿我們?nèi)祟愄幚碚Z言的方式(至少是我們自己所認為的方式):從左到右的順序閱讀。慶幸的是,這并不意味著CNNs沒有效果。所有的模型都是錯的,只是一些能被利用。實際上CNNs對NLP問題的效果非常理想。正如詞袋模型(Bag?of?Words?model),它明顯是基于錯誤假設(shè)的過于簡化模型,但這不影響它多年來一直被作為NLP的標準方法,并且取得了不錯的效果。

CNNs的主要特點在于速度快。非常的快。卷積運算是計算機圖像的核心部分,在GPU級別的硬件層實現(xiàn)。相比于n-grams,CNNs表征方式的效率也更勝一籌。由于詞典龐大,任何超過3-grams的計算開銷就會非常的大。即使Google也最多不超過5-grams。卷積濾波器能自動學(xué)習(xí)好的表示方式,不需要用整個詞表來表征。那么用尺寸大于5行的濾波器完全合情合理了。我個人認為許多在第一層學(xué)到的濾波器撲捉到的特征與n-grams非常相似(但不局限),但是以更緊湊的方式表征。

CNN的超參數(shù)

在解釋如何將CNNs用于NLP任務(wù)之前,先來看一下構(gòu)建CNN網(wǎng)絡(luò)時需要面臨的幾個選擇。希望這能幫助你更好地理解相關(guān)文獻。

窄卷積?vs?寬卷積

在上文中解釋卷積運算的時候,我忽略了如何使用濾波器的一個小細節(jié)。在矩陣的中部使用3x3的濾波器沒有問題,在矩陣的邊緣該怎么辦呢?左上角的元素沒有頂部和左側(cè)相鄰的元素,該如何濾波呢?解決的辦法是采用補零法(zero-padding)。所有落在矩陣范圍之外的元素值都默認為0。這樣就可以對輸入矩陣的每一個元素做濾波了,輸出一個同樣大小或是更大的矩陣。補零法又被稱為是寬卷積,不使用補零的方法則被稱為窄卷積。1D的例子如圖所示:

窄卷積?vs?寬卷積。濾波器長度為5,輸入長度為7。來源:A?Convolutional?Neural?Network?for?Modelling?Sentences?(2014)

當濾波器長度相對輸入向量的長度較大時,你會發(fā)現(xiàn)寬卷積很有用,或者說很有必要。在上圖中,窄卷積輸出的長度是?(7-5)+1=3,寬卷積輸出的長度是(7+2*4-5)+1=11。一般形式為

步長

卷積運算的另一個超參數(shù)是步長,即每一次濾波器平移的距離。上面所有例子中的步長都是1,相鄰兩個濾波器有重疊。步長越大,則用到的濾波器越少,輸出的值也越少。下圖來自斯坦福的cs231課程網(wǎng)頁,分別是步長為1和2的情況:

卷積步長。左側(cè):步長為1,右側(cè):步長為2。來源:http://cs231n.github.io/convolutional-networks/

在文獻中我們常常見到的步長是1,但選擇更大的步長會讓模型更接近于遞歸神經(jīng)網(wǎng)絡(luò),其結(jié)構(gòu)就像是一棵樹。

池化層

卷積神經(jīng)網(wǎng)絡(luò)的一個重要概念就是池化層,一般是在卷積層之后。池化層對輸入做降采樣。常用的池化做法是對每個濾波器的輸出求最大值。我們并不需要對整個矩陣都做池化,可以只對某個窗口區(qū)間做池化。例如,下圖所示的是2x2窗口的最大值池化(在NLP里,我們通常對整個輸出做池化,每個濾波器只有一個輸出值):

CNN的最大池化。來源:http://cs231n.github.io/convolutional-networks/#pool

為什么要池化呢?有許多原因。

池化的特點之一就是它輸出一個固定大小的矩陣,這對分類問題很有必要。例如,如果你用了1000個濾波器,并對每個輸出使用最大池化,那么無論濾波器的尺寸是多大,也無論輸入數(shù)據(jù)的維度如何變化,你都將得到一個1000維的輸出。這讓你可以應(yīng)用不同長度的句子和不同大小的濾波器,但總是得到一個相同維度的輸出結(jié)果,傳入下一層的分類器。

池化還能降低輸出結(jié)果的維度,(理想情況下)卻能保留顯著的特征。你可以認為每個濾波器都是檢測一種特定的特征,例如,檢測句子是否包含諸如“not?amazing”等否定意思。如果這個短語在句子中的某個位置出現(xiàn),那么對應(yīng)位置的濾波器的輸出值將會非常大,而在其它位置的輸出值非常小。通過采用取最大值的方式,能將某個特征是否出現(xiàn)在句子中的信息保留下來,但是無法確定它究竟在句子的哪個位置出現(xiàn)。這個信息出現(xiàn)的位置真的很重要嗎?確實是的,它有點類似于一組n-grams模型的行為。盡管丟失了關(guān)于位置的全局信息(在句子中的大致位置),但是濾波器捕捉到的局部信息卻被保留下來了,比如“not?amazing”和“amazing?not”的意思就大相徑庭。

在圖像識別領(lǐng)域,池化還能提供平移和旋轉(zhuǎn)不變性。若對某個區(qū)域做了池化,即使圖像平移/旋轉(zhuǎn)幾個像素,得到的輸出值也基本一樣,因為每次最大值運算得到的結(jié)果總是一樣的。

通道

我們需要了解的最后一個概念是通道。通道即是輸入數(shù)據(jù)的不同“視角”。比如說,做圖像識別時一般會用到RGB通道(紅綠藍)。你可以對每個通道做卷積運算,賦予相同或不同的權(quán)值。你也同樣可以把NLP想象成有許多個通道:把不同類的詞向量表征(例如word2vecGloVe)看做是獨立的通道,或是把不同語言版本的同一句話看作是一個通道。

卷積神經(jīng)網(wǎng)絡(luò)在自然語言處理的應(yīng)用

我們接下來看看卷積神經(jīng)網(wǎng)絡(luò)模型在自然語言處理領(lǐng)域的實際應(yīng)用。我試圖去概括一些研究成果。希望至少能夠涵蓋大部分主流的成果,難免也會遺漏其它一些有意思的應(yīng)用(請在評論區(qū)提醒我)。

最適合CNNs的莫過于分類任務(wù),如語義分析、垃圾郵件檢測和話題分類。卷積運算和池化會丟失局部區(qū)域某些單詞的順序信息,因此純CNN的結(jié)構(gòu)框架不太適用于PoS?Tagging和Entity?Extraction等順序標簽任務(wù)(也不是不可能,你可以嘗試輸入位置相關(guān)的特征)。

文獻[1>在不同的分類數(shù)據(jù)集上評估CNN模型,主要是基于語義分析和話題分類任務(wù)。CNN模型在各個數(shù)據(jù)集上的表現(xiàn)非常出色,甚至有個別刷新了目前最好的結(jié)果。令人驚訝的是,這篇文章采用的網(wǎng)絡(luò)結(jié)構(gòu)非常簡單,但效果相當棒。輸入層是一個表示句子的矩陣,每一行是word2vec詞向量。接著是由若干個濾波器組成的卷積層,然后是最大池化層,最后是softmax分類器。該論文也嘗試了兩種不同形式的通道,分別是靜態(tài)和動態(tài)詞向量,其中一個通道在訓(xùn)練時動態(tài)調(diào)整而另一個不變。文獻[2]中提到了一個類似的結(jié)構(gòu),但更復(fù)雜一些。文獻[6]在網(wǎng)絡(luò)中又額外添加了一個層,用于語義聚類。

Kim,?Y.?(2014).?卷積神經(jīng)網(wǎng)絡(luò)用來語句分類

文獻[4]從原始數(shù)據(jù)訓(xùn)練CNN模型,不需要預(yù)訓(xùn)練得到word2vec或GloVe等詞向量表征。它直接對one-hot向量進行卷積運算。作者對輸入數(shù)據(jù)采用了節(jié)省空間的類似詞袋表征方式,以減少網(wǎng)絡(luò)需要學(xué)習(xí)的參數(shù)個數(shù)。在文獻[5]中作者用了CNN學(xué)習(xí)得到的非監(jiān)督式“region?embedding”來擴展模型,預(yù)測文字區(qū)域的上下文內(nèi)容。這些論文中提到的方法對處理長文本(比如影評)非常有效,但對短文本(比如推特)的效果還不清楚。憑我的直覺,對短文本使用預(yù)訓(xùn)練的詞向量應(yīng)該能比長文本取得更好的效果。

搭建一個CNN模型結(jié)構(gòu)需要選擇許多個超參數(shù),我在上文中已經(jīng)提到了一些:輸入表征(word2vec,?GloVe,?one-hot),卷積濾波器的數(shù)量和尺寸,池化策略(最大值、平均值),以及激活函數(shù)(ReLU,?tanh)。文獻[7]通過多次重復(fù)實驗,比較了不同超參數(shù)對CNN模型結(jié)構(gòu)在性能和穩(wěn)定性方面的影響。如果你想自己實現(xiàn)一個CNN用于文本分類,可以借鑒該論文的結(jié)果。其主要的結(jié)論有最大池化效果總是好于平均池化;選擇理想的濾波器尺寸很重要,但也根據(jù)任務(wù)而定需;正則化在NLP任務(wù)中的作用并不明顯。需要注意的一點是該研究所用文本集里的文本長度都相近,因此若是要處理不同長度的文本,上述結(jié)論可能不具有指導(dǎo)意義。

文獻[8]探索了CNNs在關(guān)系挖掘和關(guān)系分類任務(wù)中的應(yīng)用。除了詞向量表征之外,作者還把詞與詞的相對位置作為卷積層的輸入值。這個模型假設(shè)了所有文本元素的位置已知,每個輸入樣本只包含一種關(guān)系。文獻[9]和文獻[10]使用的模型類似。

來自微軟研究院的文獻[11]和?[12]介紹了CNNs在NLP的另一種有趣的應(yīng)用方式。這兩篇論文介紹了如何學(xué)習(xí)將句子表示成包含語義的結(jié)構(gòu),它能被用來做信息檢索。論文中給出的例子是基于用戶當前的閱讀內(nèi)容,為其推薦其它感興趣的文檔。句子的表征是基于搜索引擎的日志數(shù)據(jù)訓(xùn)練得到的。

大多數(shù)CNN模型以這樣或是那樣的訓(xùn)練方式來學(xué)習(xí)單詞和句子的詞向量表征,它是訓(xùn)練過程的一部分。并不是所有論文都關(guān)注這一步訓(xùn)練過程,也并不在乎學(xué)到的表征意義有多大。文獻[13]介紹了用CNN模型對Facebook的日志打標簽。這些學(xué)到的詞向量隨后又被成功應(yīng)用于另一個任務(wù)?——?基于點擊日志給用戶推薦感興趣的文章。

字符層面的CNNs模型

至此,所有的模型表征都是在單詞的層面上。另外有一些團隊則研究如何將CNNs模型直接用于字符。文獻[14]學(xué)到了字符層面的向量表征,將它們與預(yù)訓(xùn)練的詞向量結(jié)合,用來給語音打標簽。文獻[15]和[16]研究了直接用CNNs模型直接從字符學(xué)習(xí),而不必預(yù)訓(xùn)練詞向量了。值得注意的是,作者使用了一個相對較深的網(wǎng)絡(luò)結(jié)構(gòu),共有9層,用來完成語義分析和文本分類任務(wù)。結(jié)果顯示,用字符級輸入直接在大規(guī)模數(shù)據(jù)集(百萬級)上學(xué)習(xí)的效果非常好,但用簡單模型在小數(shù)據(jù)集(十萬級)上的學(xué)習(xí)效果一般。文獻[17]是關(guān)于字符級卷積運算在語言建模方面的應(yīng)用,將字符級CNN模型的輸出作為LSTM模型每一步的輸入。同一個模型用于不同的語言。

令人驚訝的是,上面所有論文幾乎都是發(fā)表于近兩年。顯然CNNs模型在NLP領(lǐng)域已經(jīng)有了出色的表現(xiàn),新成果和頂級系統(tǒng)還在層出不窮地出現(xiàn)。

若有疑問或是反饋,請在評論區(qū)留言。謝謝閱讀!

參考文獻

[1]Kim,?Y.?(2014).?Convolutional?Neural?Networks?for?Sentence?Classification.?Proceedings

of?the?2014?Conference?on?Empirical?Methods?in?Natural?Language?Processing?(EMNLP?2014),?1746–1751.

[2]Kalchbrenner,?N.,?Grefenstette,?E.,?&?Blunsom,?P.?(2014).?A?Convolutional?Neural

Network?for?Modelling?Sentences.?Acl,?655–665.

[3]Santos,?C.?N.?dos,?&?Gatti,?M.?(2014).?Deep?Convolutional?Neural?Networks

for?Sentiment?Analysis?of?Short?Texts.?In?COLING-2014?(pp.?69–78).

[4]Johnson,?R.,?&?Zhang,?T.?(2015).?Effective?Use?of?Word?Order?for?Text

Categorization?with?Convolutional?Neural?Networks.?To?Appear:?NAACL-2015,?(2011).

[5]Johnson,?R.,?&?Zhang,?T.?(2015).?Semi-supervised?Convolutional?Neural?Networks?for?Text?Categorization?via?Region?Embedding.

[6]Wang,?P.,?Xu,?J.,?Xu,?B.,?Liu,?C.,?Zhang,?H.,?Wang,?F.,?&?Hao,?H.?(2015).?Semantic

Clustering?and?Convolutional?Neural?Network?for?Short?Text?Categorization.?Proceedings?ACL?2015,?352–357.

[7]Zhang,?Y.,?&?Wallace,?B.?(2015).?A?Sensitivity?Analysis?of?(and?Practitioners’?Guide?to)

Convolutional?Neural?Networks?for?Sentence?Classification,

[8]Nguyen,?T.?H.,?&?Grishman,?R.?(2015).?Relation?Extraction:?Perspective?from?Convolutional

Neural?Networks.?Workshop?on?Vector?Modeling?for?NLP,?39–48.

[9]Sun,?Y.,?Lin,?L.,?Tang,?D.,?Yang,?N.,?Ji,?Z.,?&?Wang,?X.?(2015).?Modeling?Mention?,?Context

and?Entity?with?Neural?Networks?for?Entity?Disambiguation,?(Ijcai),?1333–1339.

[10]Zeng,?D.,?Liu,?K.,?Lai,?S.,?Zhou,?G.,?&?Zhao,?J.?(2014).?Relation?Classification?via

Convolutional?Deep?Neural?Network.?Coling,?(2011),?2335–2344.

[11]Gao,?J.,?Pantel,?P.,?Gamon,?M.,?He,?X.,?&?Deng,?L.?(2014).?Modeling?Interestingnesswith?Deep?Neural?Networks.

[12]Shen,?Y.,?He,?X.,?Gao,?J.,?Deng,?L.,?&?Mesnil,?G.?(2014).?A?Latent?Semantic?Model?withConvolutional-Pooling?Structure?for?Information?Retrieval.?Proceedings?of?the?23rd?ACM?International?Conferenceon

Conference?on?Information?and?Knowledge?Management?–?CIKM?’14,?101–110.

[13]Weston,?J.,?&?Adams,?K.?(2014).?#?T?AG?S?PACE?:?Semantic?Embeddings?from?Hashtags,?1822–1827.

[14]Santos,?C.,?&?Zadrozny,?B.?(2014).?Learning?Character-level?Representations?for?Part-of-Speech?Tagging.?Proceedings?of?the?31st?International?Conference?on?Machine?Learning,?ICML-14(2011),?1818–1826.

[15]Zhang,?X.Zhao,?J.,?&?LeCun,?Y.?(2015).?Character-level?Convolutional?Networks?for?Text?Classification,?1–9.

[16]Zhang,?X.,?&?LeCun,?Y.?(2015).?Text?Understanding?from?Scratch.?arXiv?E-Prints,?3,?011102.

[17]Kim,?Y.,?Jernite,?Y.,?Sontag,?D.,?&?Rush,?A.?M.?(2015).?Character-Aware?Neural?Language?Models.

原文鏈接:Understanding?Convolutional?Neural?Networks?for?NLP(譯者/趙屹華?審核/劉翔宇、朱正貴 責(zé)編/周建丁 原創(chuàng)/翻譯投稿請聯(lián)系:zhoujd@csdn.net,微信號:jianding_zhou)

譯者簡介:趙屹華,計算廣告工程師@搜狗,前生物醫(yī)學(xué)工程師,關(guān)注推薦算法、機器學(xué)習(xí)領(lǐng)域。

第九屆中國大數(shù)據(jù)技術(shù)大會將于2015年12月10-12日在北京隆重舉辦。在主會之外,會議還設(shè)立了16大分論壇,包含數(shù)據(jù)庫、深度學(xué)習(xí)、推薦系統(tǒng)、安全等6大技術(shù)論壇,金融、制造業(yè)、交通旅游、互聯(lián)網(wǎng)、醫(yī)療健康、教育等7大應(yīng)用論壇和3大熱點議題論壇,票價折扣中預(yù)購從速

本文為CSDN編譯整理,未經(jīng)允許不得轉(zhuǎn)載,如需轉(zhuǎn)載請聯(lián)系market#csdn.net(#換成@)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容