日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

盘点近期大热对比学习模型:MoCo/SimCLR/BYOL/SimSiam

發(fā)布時(shí)間:2024/10/8 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 盘点近期大热对比学习模型:MoCo/SimCLR/BYOL/SimSiam 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?PaperWeekly 原創(chuàng) ·?作者|上杉翔二

單位|悠閑會(huì)

研究方向|信息檢索

很多大佬認(rèn)為,深度學(xué)習(xí)的本質(zhì)就是做兩件事情:Representation Learning(表示學(xué)習(xí))和 Inductive Bias Learning(歸納偏好學(xué)習(xí))。在表示學(xué)習(xí)方面,如果直接對(duì)語(yǔ)義進(jìn)行監(jiān)督學(xué)習(xí),雖然表現(xiàn)很好,但是它需要很多的樣本并且往往是需要對(duì)特定的任務(wù)進(jìn)行設(shè)計(jì),很難具有遷移性。所以難怪各位大佬們都紛紛為自監(jiān)督學(xué)習(xí)站臺(tái),自監(jiān)督是未來(lái)!

自監(jiān)督學(xué)習(xí)有大類方法,一個(gè)是生成方法一個(gè)對(duì)比方法,如上圖。生成方法往往會(huì)對(duì)像素級(jí)損失進(jìn)行約束,關(guān)于這一類筆者已經(jīng)在之前的文章中進(jìn)行了整理,而對(duì)比學(xué)習(xí)在表示學(xué)習(xí)上做的事情就是:其實(shí)模型不必要知道關(guān)于特征的細(xì)節(jié),只要學(xué)到的特征足以使其和其他樣本區(qū)別開(kāi)來(lái)就行。

Contrastive loss


對(duì)比損失 Contrastive loss,簡(jiǎn)單的解釋就是,利用對(duì)比正-負(fù)樣本來(lái)學(xué)習(xí)表示。學(xué)習(xí)的目的為:

這里 x+ 是與 x 相似或相等的數(shù)據(jù)點(diǎn),稱為正樣本。x? 是與 x 不同的數(shù)據(jù)點(diǎn),稱為負(fù)樣本。score 函數(shù)是一個(gè)度量?jī)蓚€(gè)特征之間相似性的指標(biāo),直接算內(nèi)積來(lái)表示:

然后嘗試優(yōu)化以下期望,即讓正例樣本越相似,要負(fù)例樣本越遠(yuǎn)就好。

其實(shí)這個(gè)叫法最初似乎出自 Yann LeCun “Dimensionality Reduction by Learning an Invariant Mapping”,本來(lái)是用于處理在降維空間中正樣本和負(fù)樣本之間的相似/不相似的遠(yuǎn)近距離關(guān)系,式子為:

其中 ,代表兩個(gè)樣本特征的歐氏距離,y 為兩個(gè)樣本是否匹配的標(biāo)簽,y=1 代表兩個(gè)樣本相似或者匹配,y=0 則代表不匹配,margin 為設(shè)定的閾值。

損失函數(shù)主要懲罰如果原本相似的樣本 y=1,但在特征空間的歐式距離較大,則說(shuō)明當(dāng)前的模型不好,損失變大。同樣的如果原本不相似 y=0,但其特征空間的歐式距離反而小的話,損失也會(huì)變大。

上圖是 loss 與樣本特征的歐式距離 d 之間的關(guān)系,其中紅色虛線表示的是相似樣本的損失值,藍(lán)色實(shí)線表示的不相似樣本的損失值。

def?contrastive_loss(self,?y,d,batch_size):tmp=?y?*tf.square(d)#tmp=?tf.mul(y,tf.square(d))tmp2?=?(1-y)?*tf.square(tf.maximum((1?-?d),0))return?tf.reduce_sum(tmp?+tmp2)/batch_size/2???

而這種成對(duì) loss 的思想在其他領(lǐng)域如搜索推薦會(huì)有其他的變體:

  • Pairwise Ranking Loss

  • Triplet Ranking Loss

而馬上要總結(jié)的 MoCo 使用的其實(shí)是 Contrastive loss 一種變體 InfoNCE:

一個(gè)正例 ,K 個(gè)負(fù)例 ,這樣可以使只有真正匹配(與 query q 算點(diǎn)積)的樣本更相似,并且同時(shí)不匹配的不相似時(shí),loss 才低。最初出自 Contrastive Predictive Coding,據(jù)說(shuō)使用 InfoNCE,可以同時(shí)優(yōu)化 encoder 和自回歸模型。

如何選擇正-負(fù)例pair?


Easy negative example 比較容易識(shí)別,所以相對(duì)來(lái)說(shuō)找一些較難的 pair 是有利于訓(xùn)練的。一般可分為:

  • Offline mining:計(jì)算所有的數(shù)據(jù)的 embedding,然后計(jì)算所以 pair 之間的距離判斷其難易程度,主要選擇 hard 或者 semi-hard 的數(shù)據(jù)。

  • Online mining:為每一 batch 動(dòng)態(tài)挖掘有用的數(shù)據(jù),將一個(gè) batch 輸入到神經(jīng)網(wǎng)絡(luò)中,得到這個(gè) batch 數(shù)據(jù)的 embedding,Batch all 的方式還是會(huì)計(jì)算所有的合理的,Batch hard 偏向于選擇距離最大的正樣本和距離最小的負(fù)樣本。

這里需要思考的問(wèn)題是這種 pair 對(duì)究竟多少數(shù)量是合適的?

一般來(lái)說(shuō),對(duì)比方法在有更多的負(fù)樣本的情況下效果更好,因?yàn)榧俣ǜ嗟呢?fù)樣本可以更有效地覆蓋底層分布,從而給出更好的訓(xùn)練信號(hào)。

所以回到 MoCo 的圖了,既然樣本數(shù)量對(duì)于學(xué)習(xí)到的樣本質(zhì)量有很大的影響,那么我們就擴(kuò)展負(fù)樣本的數(shù)量就好!但是目前對(duì)于 batch size 是沒(méi)有很好的解決辦法的,實(shí)際上如下圖 a,loss 的梯度會(huì)流過(guò)編碼器的正樣本 q 和負(fù)樣本 k 的 Encoder。

這意味著樣本的數(shù)量被限制在 mini-batch 的尺寸上,即我們并不能采樣無(wú)窮多的樣本,GPU 負(fù)載能力有限。

對(duì)于查詢正樣本 ,要在一個(gè) batch 中(dictionary size = mini-batch size)的所有 K 中區(qū)別開(kāi)來(lái),有上圖三種方法:

  • end-to-end:先編碼 encoder(可同可不同),然后內(nèi)積算 loss 再梯度。但是這種方法由于 dictionary size 和 mini-batch 的強(qiáng)耦合性(負(fù)例樣本對(duì)也會(huì)為 loss 產(chǎn)生貢獻(xiàn),也會(huì)回傳梯度),在 batch 大的時(shí)候優(yōu)化難,而在 batch 小的時(shí)候,batch 之間的參數(shù)會(huì)不一樣,也就是 GPU 大小限制了模型的性能。

  • memory bank:把 dictionary size 從 mini-batch 中解耦出來(lái),即先把所有樣本的特征保存下來(lái) bank,然后每次隨機(jī)采樣,再梯度 query 的 encoder 的參數(shù)。但是這樣只有當(dāng)所有 key 被 sample 完以后才會(huì)更新 memory bank,不同的 key 在和 query 是不一致的和滯后的,因?yàn)槊恳淮?sample encoder 都會(huì)更新雖有 memory bank 后面也加入了 momentum,但是是針對(duì) sample 來(lái)的,在更新 memory bank 時(shí)會(huì)保留一部分上一輪的特征值。

  • MoCo:是以上兩者的融合版本,將 dictionary 作為一個(gè) queue 進(jìn)行維護(hù)當(dāng)前的negative candidates pool,且它是改成了 queue 的動(dòng)態(tài)更新機(jī)制,每 sample 一個(gè) batch key(所以一個(gè) trick 就是會(huì)使用 Shuffling BN,打亂再 BN),進(jìn)隊(duì)后相對(duì)于一些最早進(jìn)入隊(duì)列的 mini-batch 對(duì)應(yīng)的 key 進(jìn)行出隊(duì)操作,這樣保證一些過(guò)時(shí)的、一致性較弱的 key 可以被清除掉。這樣就同樣是解耦,K 是隊(duì)列長(zhǎng)度,K 可以設(shè)置很大,同時(shí)更新也不會(huì)有問(wèn)題。

按照以上偽碼,可以簡(jiǎn)單看看 MoCo 的三個(gè)比較重要的函數(shù):

@torch.no_grad()def?_momentum_update_key_encoder(self):"""key?encoder的Momentum?update"""for?param_q,?param_k?in?zip(self.encoder_q.parameters(),?self.encoder_k.parameters()):param_k.data?=?param_k.data?*?self.m?+?param_q.data?*?(1.?-?self.m)@torch.no_grad()def?_dequeue_and_enqueue(self,?keys):"""完成對(duì)隊(duì)列的出隊(duì)和入隊(duì)更新"""#?在更新隊(duì)列前得到keyskeys?=?concat_all_gather(keys)#合并所有keysbatch_size?=?keys.shape[0]ptr?=?int(self.queue_ptr)assert?self.K?%?batch_size?==?0??#?for?simplicity#?出隊(duì)入隊(duì)完成隊(duì)列的更新self.queue[:,?ptr:ptr?+?batch_size]?=?keys.Tptr?=?(ptr?+?batch_size)?%?self.K??#?用來(lái)移動(dòng)的指針self.queue_ptr[0]?=?ptrdef?forward(self,?im_q,?im_k):#?計(jì)算query?featuresq?=?self.encoder_q(im_q)??#?queries:?NxCq?=?nn.functional.normalize(q,?dim=1)#?計(jì)算key?featureswith?torch.no_grad():??#?對(duì)于keys是沒(méi)有梯度的反向的self._momentum_update_key_encoder()??#?用自己的來(lái)更新key?encoder#?執(zhí)行shuffle?BNim_k,?idx_unshuffle?=?self._batch_shuffle_ddp(im_k)k?=?self.encoder_k(im_k)??#?keys:?NxCk?=?nn.functional.normalize(k,?dim=1)#?還原shufflek?=?self._batch_unshuffle_ddp(k,?idx_unshuffle)#?計(jì)算概率#?positive?logits:?Nx1l_pos?=?torch.einsum('nc,nc->n',?[q,?k]).unsqueeze(-1)?#用愛(ài)因斯坦求和來(lái)算sum#?negative?logits:?NxKl_neg?=?torch.einsum('nc,ck->nk',?[q,?self.queue.clone().detach()])#?logits:?Nx(1+K)logits?=?torch.cat([l_pos,?l_neg],?dim=1)#?平滑softmax的分布,T越大越平logits?/=?self.T#?labels是正例indexlabels?=?torch.zeros(logits.shape[0],?dtype=torch.long).cuda()#?出隊(duì)入隊(duì)更新self._dequeue_and_enqueue(k)return?logits,?labels

論文鏈接:

https://arxiv.org/abs/1911.05722


代碼鏈接:

https://github.com/facebookresearch/moco

完整的中文源碼閱讀筆記:

https://github.com/nakaizura/Source-Code-Notebook/tree/master/MoCo

SimCLR


MoCo 強(qiáng)調(diào) pair 對(duì)的樣本數(shù)量對(duì)對(duì)比學(xué)習(xí)很重要,SimCLR 認(rèn)為構(gòu)建負(fù)例的方式也很重要。先說(shuō)結(jié)論:

  • 多個(gè)數(shù)據(jù)增強(qiáng)方法組合對(duì)于對(duì)比預(yù)測(cè)任務(wù)產(chǎn)生有效表示非常重要。此外,與有監(jiān)督學(xué)習(xí)相比,數(shù)據(jù)增強(qiáng)對(duì)于無(wú)監(jiān)督學(xué)習(xí)更加有用;

  • 在表示和對(duì)比損失之間引入一個(gè)可學(xué)習(xí)的非線性變換可以大幅提高模型學(xué)到的表示的質(zhì)量;

  • 與監(jiān)督學(xué)習(xí)相比,對(duì)比學(xué)習(xí)得益于更大的批量和更多的訓(xùn)練步驟。

模型過(guò)程如下:

  • 先 sample 一些圖片(batch)

  • 對(duì) batch 里的 image 做不同的 data augmentation,如圖上的 和 ,將其視為正對(duì);

  • 一個(gè)基本的神經(jīng)網(wǎng)絡(luò)編碼器 f(·),從增強(qiáng)數(shù)據(jù)中提取表示向量, 作者使用 ResNet-50;

  • 一個(gè)小的神經(jīng)網(wǎng)絡(luò)投射頭(projection head)g(·),將表示映射到對(duì)比損失的空間;

  • 目標(biāo)是希望同一張圖片、不同 augmentation 的結(jié)果相近,并互斥其他結(jié)果。

作者認(rèn)為多種數(shù)據(jù)增強(qiáng)操作的組合是學(xué)習(xí)良好表示的關(guān)鍵,論文里面主要討論過(guò)的有如下:


推薦有一個(gè) github 用于數(shù)據(jù)增強(qiáng)很好用,pip install imgaug:

https://github.com/aleju/imgaug

為什么要用非線性的projection head?

由圖可知在 representation 與 contrastive loss 間使用了可學(xué)習(xí)的 non-linear projection,這個(gè)其實(shí)是非常簡(jiǎn)單的單層 MLP+ReLU 的架構(gòu)。其優(yōu)勢(shì)在于避免計(jì)算 similarity 的 loss function 在訓(xùn)練時(shí)丟掉一些重要的 feature,可以改善之前的層的表示質(zhì)量。

損失函數(shù) NT-Xent(the normalized temperature-scaled cross entropy loss), 和 是從 Projection Head 獲得的輸出矢量,output∈{0,1} if k≠i,τ 表示溫度參數(shù)可以用來(lái)放縮概率。

值得注意的一個(gè) trick 就是會(huì)算兩次(即公式中間的 2N,會(huì)把 i-j 的計(jì)算,用 j-i 成對(duì)的再算一次)

做完訓(xùn)練后,特征表示可以拿去下游做微調(diào),比如用于圖像分類等下游任務(wù)。整體的框架圖如下:

論文鏈接:

https://arxiv.org/abs/2002.05709


代碼鏈接:

https://github.com/google-research/simclr

注:他們用了 128 塊 GPU/TPU,來(lái)處理每個(gè) minibatch 9000 個(gè)以上樣本(這是為了獲得足夠的負(fù)樣本對(duì)比,所以必須要比普通的 batch 要大),并完成 1000 輪的訓(xùn)練。

MoCo v2

在 MoCo 的基礎(chǔ)上加入了 SimCLR 的 projection head 和多種數(shù)據(jù)增強(qiáng)手段如模糊等。ImageNet 任務(wù)提升了 6%。

SimCLR v2

結(jié)合無(wú)監(jiān)督預(yù)訓(xùn)練、半監(jiān)督訓(xùn)練、有監(jiān)督的微調(diào)和未標(biāo)記數(shù)據(jù)的蒸餾等等一系列的訓(xùn)練手段。具體如下圖:

  • 左邊,非監(jiān)督的方法學(xué)習(xí)一個(gè)任務(wù)無(wú)關(guān)的通用的表征,這里直接用 SimCLR,不同點(diǎn)在于網(wǎng)絡(luò)變大和也借用了 MoCo 部分架構(gòu)。

  • 中間,用監(jiān)督的方法進(jìn)行 fine-turning

  • 右邊,在 unlabeled 大數(shù)據(jù)集上進(jìn)行蒸餾

這種架構(gòu)顯然很適合在工業(yè)界落地。

BYOL

無(wú)需負(fù)樣本也能夠取得好的效果?!出自 DeepMind的 NIPS20’的Bootstrap Your Own Latent(BYOL),BYOL 認(rèn)為之前的方法都基于 negative pairs,而它們很大程度上取決于圖像增強(qiáng)的選擇,所以為什么不直接從圖像增強(qiáng)視角出發(fā)呢?框架圖如下:

沒(méi)有 pair,但是 BYOL 使用兩個(gè)相互交互并相互學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò),分別稱為在線網(wǎng)絡(luò)和目標(biāo)網(wǎng)絡(luò)。架構(gòu)如上:

  • 上面的分支是 online network,包括了 embedding,projection 以及 prediction,其中嵌入的使我們最要想要的模塊。

  • 下面的分支是 target network,包括 embedding 和 projection 。

  • online 網(wǎng)絡(luò)參數(shù)使用 L2 的梯度進(jìn)行更新,而 target 網(wǎng)絡(luò)直接通過(guò) online 的 momentum 得到,這里 target 的就充當(dāng)了之前負(fù)樣本的功能。

即 target 可以隨機(jī)開(kāi)始得到輸出比如一開(kāi)始的結(jié)果為 1.4% 非常差,此時(shí)新開(kāi)一個(gè)分支訓(xùn)練 online 去預(yù)測(cè)同一圖像在不同增強(qiáng)視角下的 target 的表示(從一個(gè)分支直接預(yù)測(cè)了另一個(gè)分支的輸出,用滾動(dòng)編碼方法更新),此時(shí)結(jié)果居然就可以到非常高的程度了。

也正是 BYOL 主打其 不需要進(jìn)行 negative 樣本的 idea。所以因此它的性能對(duì) batch size 的大小不是特別敏感,在同等參數(shù)量的情況下,BYOL 的效果也是非常好。

為什么BYOL有效?

最近有一篇論文對(duì)其做了細(xì)致的測(cè)試,其中最關(guān)鍵的結(jié)論就是:BYOL 移除 BN 之后的表現(xiàn)就和隨機(jī)瞎猜一樣了。由于 BN 的出現(xiàn)本來(lái)就是為了克服 domain 和 target 的差異問(wèn)題,即預(yù)防 mode collapse,可以將正負(fù)樣本的距離拉開(kāi),所以 BYOL 可能也是做了這樣的事情,做了對(duì)圖片均值和方差的學(xué)習(xí),然后重新分配結(jié)果和特征值。

BYOL和MoCo、SimCLR的區(qū)別

  • MoCo、SimCLR 更偏向于問(wèn)這兩張圖片之間有何差異?

  • BYOL 可能是在問(wèn)這張圖片與這些圖片的平均有什么差異?

論文鏈接:

https://arxiv.org/abs/2006.07733

SimSiam

孿生網(wǎng)絡(luò)已成為無(wú)監(jiān)督表達(dá)學(xué)習(xí)領(lǐng)域的通用架構(gòu),現(xiàn)有方法通過(guò)最大化同一圖像的兩者增廣之后的相似性使其避免“崩潰解(collapsing solutions)”問(wèn)題。即在訓(xùn)練網(wǎng)絡(luò)的時(shí)候,網(wǎng)絡(luò)會(huì)很迅速找了一個(gè)退化解并達(dá)到了最小可能損失 -1。

但是在 kaiming 大神的這篇文章中,他們提出的 Simple Siamese(SimSiam)網(wǎng)絡(luò)不僅可以沒(méi)有 negative sample pairs;沒(méi)有 arge batch;甚至沒(méi)有 momentum encoders 就學(xué)到有意義的特征表達(dá)。

主要是提出 stop-grad 的概念,結(jié)構(gòu)如下:

前面的部分基本相同,輸入兩個(gè)隨機(jī)變換的 和 ,通過(guò)相同的孿生網(wǎng)絡(luò)提取特征并變換到高維空間,然后可以看到左邊的分支有個(gè) projection head h 得到 ,之后再與右邊得到的 ,兩者的結(jié)果進(jìn)行匹配使 cosine 最小化:

而重點(diǎn)的 Stop-gradient,意思是在 loss 的第一項(xiàng)的時(shí)候, 不會(huì)從 接收梯度信息;同時(shí)在計(jì)算第二項(xiàng),則會(huì)從 接收梯度信息,即 loss 變?yōu)?#xff1a;

#?Algorithm1?SimSiam?Pseudocode,?Pytorch-like # f: backbone + projection mlp。f是backbone+projection head部分組成 #?h:?prediction?mlp for?x?in?loader:?#?load?a?minibatch?x?with?n?samplesx1,?x2?=?aug(x),?aug(x)?#?random?augmentation,隨機(jī)增強(qiáng)后的x1和x2#分別做兩次投影操作z1,?z2?=?f(x1),?f(x2)?#?projections,?n-by-dp1,?p2?=?h(z1),?h(z2)?#?predictions,?n-by-d#計(jì)算不對(duì)稱的兩個(gè)D得到loss?LL?=?D(p1,?z2)/2?+?D(p2,?z1)/2?#?lossL.backward()?#?back-propagate,反向傳播update(f,?h)?#?SGD?update,梯度更新def?D(p,?z):?#?negative?cosine?similarityz?=?z.detach()?#?stop?gradient,在這里使用detach做stopgrad的操作p?=?normalize(p,?dim=1)?#?l2-normalizez?=?normalize(z,?dim=1)?#?l2-normalize return?-(p*z).sum(dim=1).mean()

其實(shí) stopgrad 的本質(zhì)就是一個(gè)交替方案(固定一個(gè),求解另一個(gè))的近似求解。

論文鏈接:

https://arxiv.org/abs/2011.10566

最后再看個(gè)對(duì)比方便分清楚:

更多閱讀

#投 稿?通 道#

?讓你的論文被更多人看到?

如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識(shí)的人。

總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?

PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得技術(shù)干貨。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來(lái)。

?????來(lái)稿標(biāo)準(zhǔn):

? 稿件確系個(gè)人原創(chuàng)作品,來(lái)稿需注明作者個(gè)人信息(姓名+學(xué)校/工作單位+學(xué)歷/職位+研究方向)?

? 如果文章并非首發(fā),請(qǐng)?jiān)谕陡鍟r(shí)提醒并附上所有已發(fā)布鏈接?

? PaperWeekly 默認(rèn)每篇文章都是首發(fā),均會(huì)添加“原創(chuàng)”標(biāo)志

?????投稿郵箱:

? 投稿郵箱:hr@paperweekly.site?

? 所有文章配圖,請(qǐng)單獨(dú)在附件中發(fā)送?

? 請(qǐng)留下即時(shí)聯(lián)系方式(微信或手機(jī)),以便我們?cè)诰庉嫲l(fā)布時(shí)和作者溝通

????

現(xiàn)在,在「知乎」也能找到我們了

進(jìn)入知乎首頁(yè)搜索「PaperWeekly」

點(diǎn)擊「關(guān)注」訂閱我們的專欄吧

關(guān)于PaperWeekly

PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。

總結(jié)

以上是生活随笔為你收集整理的盘点近期大热对比学习模型:MoCo/SimCLR/BYOL/SimSiam的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。