摘要:本文以機(jī)器翻譯為例,深入淺出地介紹了深度學(xué)習(xí)中注意力機(jī)制的原理及關(guān)鍵計(jì)算機(jī)制,同時(shí)也抽象出其本質(zhì)思想,并介紹了注意力模型在圖像及語音等領(lǐng)域的典型應(yīng)用場(chǎng)景。
最近兩年,注意力模型(Attention Model)被廣泛使用在自然語言處理、圖像識(shí)別及語音識(shí)別等各種不同類型的深度學(xué)習(xí)任務(wù)中,是深度學(xué)習(xí)技術(shù)中最值得關(guān)注與深入了解的核心技術(shù)之一。
本文以機(jī)器翻譯為例,深入淺出地介紹了深度學(xué)習(xí)中注意力機(jī)制的原理及關(guān)鍵計(jì)算機(jī)制,同時(shí)也抽象出其本質(zhì)思想,并介紹了注意力模型在圖像及語音等領(lǐng)域的典型應(yīng)用場(chǎng)景。
注意力模型最近幾年在深度學(xué)習(xí)各個(gè)領(lǐng)域被廣泛使用,無論是圖像處理、語音識(shí)別還是自然語言處理的各種不同類型的任務(wù)中,都很容易遇到注意力模型的身影。所以,了解注意力機(jī)制的工作原理對(duì)于關(guān)注深度學(xué)習(xí)技術(shù)發(fā)展的技術(shù)人員來說有很大的必要。
人類的視覺注意力
從注意力模型的命名方式看,很明顯其借鑒了人類的注意力機(jī)制,因此,我們首先簡(jiǎn)單介紹人類視覺的選擇性注意力機(jī)制。
圖1 人類的視覺注意力
視覺注意力機(jī)制是人類視覺所特有的大腦信號(hào)處理機(jī)制。人類視覺通過快速掃描全局圖像,獲得需要重點(diǎn)關(guān)注的目標(biāo)區(qū)域,也就是一般所說的注意力焦點(diǎn),而后對(duì)這一區(qū)域投入更多注意力資源,以獲取更多所需要關(guān)注目標(biāo)的細(xì)節(jié)信息,而抑制其他無用信息。
這是人類利用有限的注意力資源從大量信息中快速篩選出高價(jià)值信息的手段,是人類在長(zhǎng)期進(jìn)化中形成的一種生存機(jī)制,人類視覺注意力機(jī)制極大地提高了視覺信息處理的效率與準(zhǔn)確性。
圖1形象化展示了人類在看到一副圖像時(shí)是如何高效分配有限的注意力資源的,其中紅色區(qū)域表明視覺系統(tǒng)更關(guān)注的目標(biāo),很明顯對(duì)于圖1所示的場(chǎng)景,人們會(huì)把注意力更多投入到人的臉部,文本的標(biāo)題以及文章首句等位置。
深度學(xué)習(xí)中的注意力機(jī)制從本質(zhì)上講和人類的選擇性視覺注意力機(jī)制類似,核心目標(biāo)也是從眾多信息中選擇出對(duì)當(dāng)前任務(wù)目標(biāo)更關(guān)鍵的信息。
Encoder-Decoder框架
要了解深度學(xué)習(xí)中的注意力模型,就不得不先談Encoder-Decoder框架,因?yàn)槟壳按蠖鄶?shù)注意力模型附著在Encoder-Decoder框架下,當(dāng)然,其實(shí)注意力模型可以看作一種通用的思想,本身并不依賴于特定框架,這點(diǎn)需要注意。
Encoder-Decoder框架可以看作是一種深度學(xué)習(xí)領(lǐng)域的研究模式,應(yīng)用場(chǎng)景異常廣泛。圖2是文本處理領(lǐng)域里常用的Encoder-Decoder框架最抽象的一種表示。
圖2 抽象的文本處理領(lǐng)域的Encoder-Decoder框架
文本處理領(lǐng)域的Encoder-Decoder框架可以這么直觀地去理解:可以把它看作適合處理由一個(gè)句子(或篇章)生成另外一個(gè)句子(或篇章)的通用處理模型。對(duì)于句子對(duì)
每個(gè)yi都依次這么產(chǎn)生,么看起來就是整個(gè)系統(tǒng)根據(jù)輸入句子Source生成了目標(biāo)句子Target。如果Source是中文句子,Target是英文句子,那么這就是解決機(jī)器翻譯問題的Encoder-Decoder框架;如果Source是一篇文章,Target是概括性的幾句描述語句,那么這是文本摘要的Encoder-Decoder框架;如果Source是一句問句,Target是一句回答,那么這是問答系統(tǒng)或者對(duì)話機(jī)器人的Encoder-Decoder框架。由此可見,在文本處理領(lǐng)域,Encoder-Decoder的應(yīng)用領(lǐng)域相當(dāng)廣泛。
Encoder-Decoder框架不僅僅在文本領(lǐng)域廣泛使用,在語音識(shí)別、圖像處理等領(lǐng)域也經(jīng)常使用。比如對(duì)于語音識(shí)別來說,圖2所示的框架完全適用,區(qū)別無非是Encoder部分的輸入是語音流,輸出是對(duì)應(yīng)的文本信息;而對(duì)于“圖像描述”任務(wù)來說,Encoder部分的輸入是一副圖片,Decoder的輸出是能夠描述圖片語義內(nèi)容的一句描述語。一般而言,文本處理和語音識(shí)別的Encoder部分通常采用RNN模型,圖像處理的Encoder一般采用CNN模型。
Attention模型
本節(jié)先以機(jī)器翻譯作為例子講解最常見的Soft Attention模型的基本原理,之后拋離Encoder-Decoder框架抽象出了注意力機(jī)制的本質(zhì)思想,然后簡(jiǎn)單介紹最近廣為使用的Self Attention的基本思路。
Soft Attention模型
圖2中展示的Encoder-Decoder框架是沒有體現(xiàn)出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。為什么說它注意力不集中呢?請(qǐng)觀察下目標(biāo)句子Target中每個(gè)單詞的生成過程如下:
在翻譯“杰瑞”這個(gè)中文單詞的時(shí)候,分心模型里面的每個(gè)英文單詞對(duì)于翻譯目標(biāo)單詞“杰瑞”貢獻(xiàn)是相同的,很明顯這里不太合理,顯然“Jerry”對(duì)于翻譯成“杰瑞”更重要,但是分心模型是無法體現(xiàn)這一點(diǎn)的,這就是為何說它沒有引入注意力的原因。
沒有引入注意力的模型在輸入句子比較短的時(shí)候問題不大,但是如果輸入句子比較長(zhǎng),此時(shí)所有語義完全通過一個(gè)中間語義向量來表示,單詞自身的信息已經(jīng)消失,可想而知會(huì)丟失很多細(xì)節(jié)信息,這也是為何要引入注意力模型的重要原因。
上面的例子中,如果引入Attention模型的話,應(yīng)該在翻譯“杰瑞”的時(shí)候,體現(xiàn)出英文單詞對(duì)于翻譯當(dāng)前中文單詞不同的影響程度,比如給出類似下面一個(gè)概率分布值:
(Tom,0.3)(Chase,0.2) (Jerry,0.5)
每個(gè)英文單詞的概率代表了翻譯當(dāng)前單詞“杰瑞”時(shí),注意力分配模型分配給不同英文單詞的注意力大小。這對(duì)于正確翻譯目標(biāo)語單詞肯定是有幫助的,因?yàn)橐肓诵碌男畔ⅰ?/p>
圖3 引入注意力模型的Encoder-Decoder框架
即生成目標(biāo)句子單詞的過程成了下面的形式:
圖4 Attention的形成過程
這里還有一個(gè)問題:生成目標(biāo)句子某個(gè)單詞,比如“湯姆”的時(shí)候,如何知道Attention模型所需要的輸入句子單詞注意力分配概率分布值呢?就是說“湯姆”對(duì)應(yīng)的輸入句子Source中各個(gè)單詞的概率分布:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?
為了便于說明,我們假設(shè)對(duì)圖2的非Attention模型的Encoder-Decoder框架進(jìn)行細(xì)化,Encoder采用RNN模型,Decoder也采用RNN模型,這是比較常見的一種模型配置,則圖2的框架轉(zhuǎn)換為圖5。
圖5 RNN作為具體模型的Encoder-Decoder框架
那么用圖6可以較為便捷地說明注意力分配概率分布值的通用計(jì)算過程。
圖6 注意力分配概率計(jì)算
絕大多數(shù)Attention模型都是采取上述的計(jì)算框架來計(jì)算注意力分配概率分布信息,區(qū)別只是在F的定義上可能有所不同。圖7可視化地展示了在英語-德語翻譯系統(tǒng)中加入Attention機(jī)制后,Source和Target兩個(gè)句子每個(gè)單詞對(duì)應(yīng)的注意力分配概率分布。
圖7 英語-德語翻譯的注意力概率分布
上述內(nèi)容就是經(jīng)典的Soft Attention模型的基本思想,那么怎么理解Attention模型的物理含義呢?一般在自然語言處理應(yīng)用里會(huì)把Attention模型看作是輸出Target句子中某個(gè)單詞和輸入Source句子每個(gè)單詞的對(duì)齊模型,這是非常有道理的。
目標(biāo)句子生成的每個(gè)單詞對(duì)應(yīng)輸入句子單詞的概率分布可以理解為輸入句子單詞和這個(gè)目標(biāo)生成單詞的對(duì)齊概率,這在機(jī)器翻譯語境下是非常直觀的:傳統(tǒng)的統(tǒng)計(jì)機(jī)器翻譯一般在做的過程中會(huì)專門有一個(gè)短語對(duì)齊的步驟,而注意力模型其實(shí)起的是相同的作用。
圖8 Google 神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯系統(tǒng)結(jié)構(gòu)圖
圖8所示即為Google于2016年部署到線上的基于神經(jīng)網(wǎng)絡(luò)的機(jī)器翻譯系統(tǒng),相對(duì)傳統(tǒng)模型翻譯效果有大幅提升,翻譯錯(cuò)誤率降低了60%,其架構(gòu)就是上文所述的加上Attention機(jī)制的Encoder-Decoder框架,主要區(qū)別無非是其Encoder和Decoder使用了8層疊加的LSTM模型。
Attention機(jī)制的本質(zhì)思想
如果把Attention機(jī)制從上文講述例子中的Encoder-Decoder框架中剝離,并進(jìn)一步做抽象,可以更容易看懂Attention機(jī)制的本質(zhì)思想。
圖9 Attention機(jī)制的本質(zhì)思想
我們可以這樣來看待Attention機(jī)制(參考圖9):將Source中的構(gòu)成元素想象成是由一系列的
當(dāng)然,從概念上理解,把Attention仍然理解為從大量信息中有選擇地篩選出少量重要信息并聚焦到這些重要信息上,忽略大多不重要的信息,這種思路仍然成立。聚焦的過程體現(xiàn)在權(quán)重系數(shù)的計(jì)算上,權(quán)重越大越聚焦于其對(duì)應(yīng)的Value值上,即權(quán)重代表了信息的重要性,而Value是其對(duì)應(yīng)的信息。
從圖9可以引出另外一種理解,也可以將Attention機(jī)制看作一種軟尋址(Soft Addressing):Source可以看作存儲(chǔ)器內(nèi)存儲(chǔ)的內(nèi)容,元素由地址Key和值Value組成,當(dāng)前有個(gè)Key=Query的查詢,目的是取出存儲(chǔ)器中對(duì)應(yīng)的Value值,即Attention數(shù)值。通過Query和存儲(chǔ)器內(nèi)元素Key的地址進(jìn)行相似性比較來尋址,之所以說是軟尋址,指的不像一般尋址只從存儲(chǔ)內(nèi)容里面找出一條內(nèi)容,而是可能從每個(gè)Key地址都會(huì)取出內(nèi)容,取出內(nèi)容的重要性根據(jù)Query和Key的相似性來決定,之后對(duì)Value進(jìn)行加權(quán)求和,這樣就可以取出最終的Value值,也即Attention值。所以不少研究人員將Attention機(jī)制看作軟尋址的一種特例,這也是非常有道理的。
至于Attention機(jī)制的具體計(jì)算過程,如果對(duì)目前大多數(shù)方法進(jìn)行抽象的話,可以將其歸納為兩個(gè)過程:第一個(gè)過程是根據(jù)Query和Key計(jì)算權(quán)重系數(shù),第二個(gè)過程根據(jù)權(quán)重系數(shù)對(duì)Value進(jìn)行加權(quán)求和。而第一個(gè)過程又可以細(xì)分為兩個(gè)階段:第一個(gè)階段根據(jù)Query和Key計(jì)算兩者的相似性或者相關(guān)性;第二個(gè)階段對(duì)第一階段的原始分值進(jìn)行歸一化處理;這樣,可以將Attention的計(jì)算過程抽象為如圖10展示的三個(gè)階段。
圖10 三階段計(jì)算Attention過程
在第一個(gè)階段,可以引入不同的函數(shù)和計(jì)算機(jī)制,根據(jù)Query和某個(gè)keyi,計(jì)算兩者的相似性或者相關(guān)性,最常見的方法包括:求兩者的向量點(diǎn)積、求兩者的向量Cosine相似性或者通過再引入額外的神經(jīng)網(wǎng)絡(luò)來求值,即如下方式:
第一階段產(chǎn)生的分值根據(jù)具體產(chǎn)生的方法不同其數(shù)值取值范圍也不一樣,第二階段引入類似SoftMax的計(jì)算方式對(duì)第一階段的得分進(jìn)行數(shù)值轉(zhuǎn)換,一方面可以進(jìn)行歸一化,將原始計(jì)算分值整理成所有元素權(quán)重之和為1的概率分布;另一方面也可以通過SoftMax的內(nèi)在機(jī)制更加突出重要元素的權(quán)重。即一般采用如下公式計(jì)算:
通過如上三個(gè)階段的計(jì)算,即可求出針對(duì)Query的Attention數(shù)值,目前絕大多數(shù)具體的注意力機(jī)制計(jì)算方法都符合上述的三階段抽象計(jì)算過程。
Self Attention模型
通過上述對(duì)Attention本質(zhì)思想的梳理,我們可以更容易理解本節(jié)介紹的Self Attention模型。Self Attention也經(jīng)常被稱為intra Attention(內(nèi)部Attention),最近一年也獲得了比較廣泛的使用,比如Google的機(jī)器翻譯模型內(nèi)部大量采用了Self Attention模型。
在一般任務(wù)的Encoder-Decoder框架中,輸入Source和輸出Target內(nèi)容是不一樣的,比如對(duì)于英-中機(jī)器翻譯來說,Source是英文句子,Target是對(duì)應(yīng)的翻譯出的中文句子,Attention機(jī)制發(fā)生在Target的元素Query和Source中的所有元素之間。而Self Attention顧名思義,指的不是Target和Source之間的Attention機(jī)制,而是Source內(nèi)部元素之間或者Target內(nèi)部元素之間發(fā)生的Attention機(jī)制,也可以理解為Target=Source這種特殊情況下的注意力計(jì)算機(jī)制。其具體計(jì)算過程是一樣的,只是計(jì)算對(duì)象發(fā)生了變化而已,所以此處不再贅述其計(jì)算過程細(xì)節(jié)。
如果是常規(guī)的Target不等于Source情形下的注意力計(jì)算,其物理含義正如上文所講,比如對(duì)于機(jī)器翻譯來說,本質(zhì)上是目標(biāo)語單詞和源語單詞之間的一種單詞對(duì)齊機(jī)制。那么如果是Self Attention機(jī)制,一個(gè)很自然的問題是:通過Self Attention到底學(xué)到了哪些規(guī)律或者抽取出了哪些特征呢?或者說引入Self Attention有什么增益或者好處呢?我們?nèi)匀灰詸C(jī)器翻譯中的Self Attention來說明,圖11和圖12是可視化地表示Self Attention在同一個(gè)英語句子內(nèi)單詞間產(chǎn)生的聯(lián)系。
圖11 可視化Self Attention實(shí)例
圖12 可視化Self Attention實(shí)例
從兩張圖(圖11、圖12)可以看出,Self Attention可以捕獲同一個(gè)句子中單詞之間的一些句法特征(比如圖11展示的有一定距離的短語結(jié)構(gòu))或者語義特征(比如圖12展示的its的指代對(duì)象Law)。
很明顯,引入Self Attention后會(huì)更容易捕獲句子中長(zhǎng)距離的相互依賴的特征,因?yàn)槿绻荝NN或者LSTM,需要依次序序列計(jì)算,對(duì)于遠(yuǎn)距離的相互依賴的特征,要經(jīng)過若干時(shí)間步步驟的信息累積才能將兩者聯(lián)系起來,而距離越遠(yuǎn),有效捕獲的可能性越小。
但是Self Attention在計(jì)算過程中會(huì)直接將句子中任意兩個(gè)單詞的聯(lián)系通過一個(gè)計(jì)算步驟直接聯(lián)系起來,所以遠(yuǎn)距離依賴特征之間的距離被極大縮短,有利于有效地利用這些特征。除此外,Self Attention對(duì)于增加計(jì)算的并行性也有直接幫助作用。這是為何Self Attention逐漸被廣泛使用的主要原因。
Attention機(jī)制的應(yīng)用
前文有述,Attention機(jī)制在深度學(xué)習(xí)的各種應(yīng)用領(lǐng)域都有廣泛的使用場(chǎng)景。上文在介紹過程中我們主要以自然語言處理中的機(jī)器翻譯任務(wù)作為例子,下面分別再從圖像處理領(lǐng)域和語音識(shí)別選擇典型應(yīng)用實(shí)例來對(duì)其應(yīng)用做簡(jiǎn)單說明。
圖13 圖片-描述任務(wù)的Encoder-Decoder框架
圖片描述(Image-Caption)是一種典型的圖文結(jié)合的深度學(xué)習(xí)應(yīng)用,輸入一張圖片,人工智能系統(tǒng)輸出一句描述句子,語義等價(jià)地描述圖片所示內(nèi)容。很明顯這種應(yīng)用場(chǎng)景也可以使用Encoder-Decoder框架來解決任務(wù)目標(biāo),此時(shí)Encoder輸入部分是一張圖片,一般會(huì)用CNN來對(duì)圖片進(jìn)行特征抽取,Decoder部分使用RNN或者LSTM來輸出自然語言句子(參考圖13)。
此時(shí)如果加入Attention機(jī)制能夠明顯改善系統(tǒng)輸出效果,Attention模型在這里起到了類似人類視覺選擇性注意的機(jī)制,在輸出某個(gè)實(shí)體單詞的時(shí)候會(huì)將注意力焦點(diǎn)聚焦在圖片中相應(yīng)的區(qū)域上。圖14給出了根據(jù)給定圖片生成句子“A person is standing on a beach with a surfboard.”過程時(shí)每個(gè)單詞對(duì)應(yīng)圖片中的注意力聚焦區(qū)域。
圖14 圖片生成句子中每個(gè)單詞時(shí)的注意力聚焦區(qū)域
圖15給出了另外四個(gè)例子形象地展示了這種過程,每個(gè)例子上方左側(cè)是輸入的原圖,下方句子是人工智能系統(tǒng)自動(dòng)產(chǎn)生的描述語句,上方右側(cè)圖展示了當(dāng)AI系統(tǒng)產(chǎn)生語句中劃?rùn)M線單詞的時(shí)候,對(duì)應(yīng)圖片中聚焦的位置區(qū)域。比如當(dāng)輸出單詞dog的時(shí)候,AI系統(tǒng)會(huì)將注意力更多地分配給圖片中小狗對(duì)應(yīng)的位置。
圖15 圖像描述任務(wù)中Attention機(jī)制的聚焦作用
圖16 語音識(shí)別中音頻序列和輸出字符之間的Attention
語音識(shí)別的任務(wù)目標(biāo)是將語音流信號(hào)轉(zhuǎn)換成文字,所以也是Encoder-Decoder的典型應(yīng)用場(chǎng)景。Encoder部分的Source輸入是語音流信號(hào),Decoder部分輸出語音對(duì)應(yīng)的字符串流。
圖16可視化地展示了在Encoder-Decoder框架中加入Attention機(jī)制后,當(dāng)用戶用語音說句子 how much would a woodchuck chuck 時(shí),輸入部分的聲音特征信號(hào)和輸出字符之間的注意力分配概率分布情況,顏色越深代表分配到的注意力概率越高。從圖中可以看出,在這個(gè)場(chǎng)景下,Attention機(jī)制起到了將輸出字符和輸入語音信號(hào)進(jìn)行對(duì)齊的功能。
上述內(nèi)容僅僅選取了不同AI領(lǐng)域的幾個(gè)典型Attention機(jī)制應(yīng)用實(shí)例,Encoder-Decoder加Attention架構(gòu)由于其卓越的實(shí)際效果,目前在深度學(xué)習(xí)領(lǐng)域里得到了廣泛的使用,了解并熟練使用這一架構(gòu)對(duì)于解決實(shí)際問題會(huì)有極大幫助。
作者簡(jiǎn)介:張俊林,中科院軟件所博士,曾擔(dān)任阿里巴巴、百度、用友等公司資深技術(shù)專家及技術(shù)總監(jiān)職位,目前在新浪微博AI實(shí)驗(yàn)室擔(dān)任資深算法專家,關(guān)注深度學(xué)習(xí)在自然語言處理方面的應(yīng)用。?
歡迎加入本站公開興趣群商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉庫,數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識(shí)
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/4655.html
摘要:原文地址從實(shí)踐到原理,帶你參透在語言中大放異彩,越來越多的小伙伴在使用,最近也在公司安利了一波,希望能通過這篇文章能帶你一覽的愛與恨。幀的主要作用是裝填主體信息,是數(shù)據(jù)幀。 showImg(https://segmentfault.com/img/remote/1460000019552245); 原文地址:從實(shí)踐到原理,帶你參透 gRPC gRPC 在 Go 語言中大放異彩,越來越多...
摘要:讓你收獲滿滿碼個(gè)蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個(gè)蛋從2017年02月20...
摘要:你可以發(fā)布一個(gè)可再現(xiàn)的機(jī)器學(xué)習(xí)項(xiàng)目,它幾乎不需要用戶設(shè)置,不需要用戶花小時(shí)去下載依賴或者報(bào)錯(cuò)相反,你可以這樣做這種方法可以直接運(yùn)行你的腳本,所有的依賴包括支持都幫你準(zhǔn)備好了。應(yīng)該怎么做針對(duì)機(jī)器學(xué)習(xí)的使用場(chǎng)景,你較好把你的代碼發(fā)布到上。 Docker提供了一種將Linux Kernel中需要的內(nèi)容靜態(tài)鏈接到你的應(yīng)用中的方法。Docker容器可以使用宿主機(jī)的GPUs,因此我們可以把TensorF...
摘要:由虛擬機(jī)加載的類,被加載到虛擬機(jī)內(nèi)存中之后,虛擬機(jī)會(huì)讀取并執(zhí)行它里面存在的字節(jié)碼指令。虛擬機(jī)中執(zhí)行字節(jié)碼指令的部分叫做執(zhí)行引擎。 什么是Java虛擬機(jī)? 作為一個(gè)Java程序員,我們每天都在寫Java代碼,我們寫的代碼都是在一個(gè)叫做Java虛擬機(jī)的東西上執(zhí)行的。但是如果要問什么是虛擬機(jī),恐怕很多人就會(huì)模棱兩可了。在本文中,我會(huì)寫下我對(duì)虛擬機(jī)的理解。因?yàn)槟芰λ?,可能有些地方描述的不夠?..
閱讀 1711·2021-10-09 09:44
閱讀 3272·2021-09-27 13:36
閱讀 1531·2021-09-22 15:33
閱讀 1285·2021-09-22 15:23
閱讀 1169·2021-09-06 15:02
閱讀 1709·2019-08-29 16:14
閱讀 2915·2019-08-29 15:26
閱讀 2418·2019-08-28 18:08