針對文本數(shù)據(jù)增強(qiáng)的方法【有代碼】

論文標(biāo)題:SSMix: Saliency-Based Span Mixup for Text Classification

論文鏈接:https://arxiv.org/pdf/2106.08062.pdf

不需要翻墻論文鏈接:文獻(xiàn)全文 - 學(xué)術(shù)范 (xueshufan.com)

論文代碼:https://github.com/clovaai/ssmix

論文作者:{soyoungyoon etc.}

論文摘要

數(shù)據(jù)增強(qiáng)已證明對各種計(jì)算機(jī)視覺任務(wù)是有效的赠橙。盡管文本取得了巨大的成功渺蒿,但由于文本由可變長度的離散標(biāo)記組成雇逞,因此將混合應(yīng)用于NLP任務(wù)一直存在障礙。在這項(xiàng)工作中,我們提出了SSMix,一種新的混合方法,其中操作是對輸入文本執(zhí)行的驻粟,而不是像以前的方法那樣對隱藏向量執(zhí)行的。SSMix通過基于跨度的混合,綜合一個(gè)句子蜀撑,同時(shí)保留兩個(gè)原始文本的位置挤巡,并依賴于顯著性信息保留更多與預(yù)測相關(guān)的標(biāo)記。通過大量的實(shí)驗(yàn)酷麦,我們實(shí)證驗(yàn)證了我們的方法在廣泛的文本分類基準(zhǔn)上優(yōu)于隱藏級混合方法矿卑,包括文本隱含、情感分類和問題類型分類沃饶。

數(shù)據(jù)增強(qiáng)的效果已經(jīng)在各種計(jì)算機(jī)視覺任務(wù)中被證實(shí)是有效的母廷。盡管數(shù)據(jù)增強(qiáng)非常有效,由于文本是由變長的離散字符組成的糊肤,所以將mixup應(yīng)用與NLP任務(wù)一直存在障礙琴昆。在本篇論文,作者提出了SSMix算法馆揉,一種針對輸入文本增強(qiáng)的mixup算法业舍,而非之前針對隱藏向量的方法。SSMix通過跨度混合( span-based mixing)在保留原始兩個(gè)文本的條件下合成一個(gè)句子升酣,同時(shí)保留兩個(gè)原始文本的位置舷暮,并依賴于顯著性信息保留更多與預(yù)測相關(guān)的標(biāo)記。通過大量的實(shí)驗(yàn)噩茄,論文驗(yàn)證了該算法在廣泛的文本分類基準(zhǔn)上優(yōu)于隱藏級混合方法下面,包括文本推斷、情感分類和問題類型分類任務(wù)绩聘。

算法簡介

由于數(shù)據(jù)收集與標(biāo)志的昂貴成本沥割,數(shù)據(jù)增強(qiáng)在自然語言處理(NLP)中越來越重要。其中一些已往研究包括基于簡單的規(guī)則和模型來生成類似的文本君纫。比如通過標(biāo)準(zhǔn)方法或先進(jìn)的訓(xùn)練方法與原始樣本聯(lián)合進(jìn)行訓(xùn)練,也有基于混淆(mixup)插值文本和標(biāo)簽進(jìn)行增強(qiáng)芹彬。

Mixup及其變體訓(xùn)練算法成為計(jì)算機(jī)視覺中常用的正則化方法蓄髓,用來提高神經(jīng)網(wǎng)絡(luò)的泛化能力∈姘铮混合方法分為輸入級混合和隱藏級混合( hidden-level mixup)会喝,兩者取決于混合操作的位置。輸入級混合是一種比隱藏級混合更普遍的方法玩郊,因?yàn)樗暮唵涡院湍軌虿东@局部性肢执,從而具有更好的準(zhǔn)確性。

由于文本數(shù)據(jù)的離散性和可變的序列長度译红,在NLP中應(yīng)用mixup比在計(jì)算機(jī)視覺中更具有挑戰(zhàn)性和難度预茄。因此,之前大多數(shù)關(guān)于文本混合的嘗試將mixup應(yīng)用于嵌入向量,如嵌入或中間表示耻陕。然而根據(jù)計(jì)算機(jī)視覺的增強(qiáng)直觀感受拙徽,輸入級混合一般比隱藏級混合有優(yōu)勢。這一動(dòng)機(jī)鼓勵(lì)作者對探究文本數(shù)據(jù)的輸入級混淆方法诗宣。

在這項(xiàng)工作中膘怕,作者提出了SSMix(圖1),一種新的輸入級結(jié)合跨度(Span)的顯著性混合數(shù)據(jù)增強(qiáng)法算法召庞。首先岛心,作者通過用另一個(gè)文本中的跨度替換連續(xù)的標(biāo)記來進(jìn)行混淆,這一靈感來自CutMixarXiv篮灼,在混合文本中保留兩個(gè)源文本的位置忘古。其次,選擇一個(gè)要替換的跨度穿稳,并基于顯著性信息進(jìn)行替換存皂,以使混合文本包含與輸出預(yù)測更相關(guān)的標(biāo)記,這在語義上可能很重要逢艘。文本的輸入級方法不同于隱級混合方法旦袋,當(dāng)當(dāng)前的隱級混合方法線性插值原始隱向量,我們的方法在輸入級上混合文本字符它改,產(chǎn)生非線性輸出疤孕。同時(shí),利用顯著性值從每個(gè)句子中選擇跨度央拖,并離散地定義跨度的長度和混合比祭阀,這是與隱藏級別混合增強(qiáng)區(qū)別的地方。


SSMix已經(jīng)通過大量的文本分類基準(zhǔn)實(shí)驗(yàn)被證明是有效的鲜戒。特別強(qiáng)調(diào)的是专控,論文證明了輸入級混合方法一般要優(yōu)于隱層混合方法。論文還展示了在進(jìn)行文本混合增強(qiáng)的同時(shí)遏餐,在跨度水平上使用顯著性信息和限制標(biāo)記選擇的重要性伦腐。

SSMix算法

SSMix基本原理為:給定兩個(gè)文本和,通過將文本的片段替換為來自另一文本的顯著信息片段生成得到新的文本。同時(shí)失都,對于新文本,基于兩個(gè)文本標(biāo)簽和重新為新文本設(shè)置一個(gè)新的標(biāo)簽柏蘑。最后可以使用這個(gè)生成的增強(qiáng)虛擬樣本(,)來進(jìn)行訓(xùn)練模型粹庞。

Saliency:顯著性信息

Saliency衡量了文本數(shù)據(jù)的每個(gè)字符對最終結(jié)果預(yù)測的影響咳焚。在以往研究中基于梯度的方法被廣泛用于顯著性計(jì)算,文本同樣計(jì)算了分類損失相對于輸入嵌入的梯度庞溜,并使用其大小作為顯著性:革半。文中應(yīng)用l2范數(shù)來獲得一個(gè)梯度向量的大小,代表著每個(gè)字符的類似于PuzzleMix的顯著性。

Mixing Text:文本合成

之前提到過督惰,Mixing Text主要是是指兩個(gè)文本序列和如何合成新的文本不傅。大致思路是根據(jù)梯度顯著性計(jì)算方法得到兩個(gè)文本中每個(gè)字符的顯著性分?jǐn)?shù),然后在文本中選取一個(gè)顯著性最低的片段赏胚,長度為访娶,在文本中選取一個(gè)顯著性最低的片段,長度為觉阅。長度設(shè)置為==,其中為mixup比例參數(shù)崖疤。最后生成新文本w為,其中和為原始文本中替換片段的左右的兩部分。

Sample span length:相等片段長度

本文將原始()的長度和替換()跨度設(shè)置為相同的典勇,主要原因是使用不同長度的span(片段)將導(dǎo)致冗余和語義不明確的mixup 轉(zhuǎn)換劫哼。另外,計(jì)算不同長度的span之間的mixup 比列也過于復(fù)雜割笙。在以往研究中也采用了這種相同大小的替換策略权烧。在替換span長度相同的情況下,論文的SSMix算法能夠使顯著性的效果最大化伤溉。由于SSMix不限制字符的位置般码,可以同時(shí)選擇最顯著的span和被替換的最不顯著片段。如圖片1中乱顾,in this在文本中是不顯著的板祝,transcedent love在文本中是最顯著的,那么可以用transcedent love替換in this走净。

Mixing Text:標(biāo)簽合成

算法1 展示了如何利用原始樣本對來計(jì)算增廣樣本的混合損失券时。公式中計(jì)算了增強(qiáng)輸出logit相對于每個(gè)樣本的原始目標(biāo)標(biāo)簽的交叉熵?fù)p失,并通過加權(quán)和進(jìn)行組合伏伯,因此SSMix算法與數(shù)據(jù)集標(biāo)簽個(gè)數(shù)是不相關(guān)的橘洞,在任何數(shù)據(jù)集上,輸出標(biāo)簽比例是通過兩個(gè)原始標(biāo)簽的線性組合來計(jì)算说搅。

Paired sentence tasks:句子對任務(wù)

實(shí)驗(yàn)設(shè)置

實(shí)驗(yàn)數(shù)據(jù)集

論文實(shí)驗(yàn)數(shù)據(jù)集有文本分類和句子對分類任務(wù):


對比實(shí)驗(yàn)

論文將SSMix與三個(gè)基線進(jìn)行了比較:(1) standard training without mixup,(2)EmbedMixMix(3)TMix炸枣。


與基線和消融研究的實(shí)驗(yàn)結(jié)果進(jìn)行了比較。所有的準(zhǔn)確率值都是使用不同種子的5次運(yùn)行的平均精度(%)蜓堕。MNLI表示MNLI-不匹配的開發(fā)集的準(zhǔn)確性抛虏。論文報(bào)告了GLUE的驗(yàn)證精度博其,TREC的測試精度套才,以及ANLI的有效(上)/測試(較低)精度,可以看出SSMix在大部分?jǐn)?shù)據(jù)集效果要優(yōu)于其他混合增強(qiáng)算法慕淡。


論文總結(jié)

與隱層混合方法相比背伴,SSMix在具有足夠數(shù)據(jù)量的數(shù)據(jù)集上充分證明了其有效性。由于SSMix是一個(gè)離散的組合,而不是兩個(gè)數(shù)據(jù)樣本的線性組合傻寂,它在一個(gè)合成空間上創(chuàng)建數(shù)據(jù)樣本的范圍大于隱藏級別的混合息尺。論文假設(shè),大量的數(shù)據(jù)有助于更好地在合成空間中進(jìn)行表示疾掰。

SSMix對于多個(gè)類標(biāo)簽數(shù)據(jù)集(TREC搂誉、ANLI、MNLI静檬、QNLI)尤其有效炭懊。因此,在沒有混合的訓(xùn)練條件下拂檩,SSMix在TREC-fine(47個(gè)標(biāo)簽)上的精度增益遠(yuǎn)高于TRECcrare(6個(gè)標(biāo)簽)侮腹,+分別為3.56和+為0.52。具有多個(gè)總類標(biāo)簽的數(shù)據(jù)集增加了在混合源的隨機(jī)抽樣中被選擇交叉標(biāo)簽的可能性稻励,所以可以認(rèn)為在這些多標(biāo)簽分類數(shù)據(jù)集中的混合性能會(huì)顯著提高

在成對句子任務(wù)上具有顯著優(yōu)勢父阻,如文本隱含或相似性分類。現(xiàn)有的方法(隱藏層混合)在隱藏層上應(yīng)用混合望抽,而不考慮特殊的標(biāo)記加矛,即[SEP]、[CLS]糠聪。這些方法可能會(huì)丟失關(guān)于句子開頭的信息或句子對的適當(dāng)分離荒椭。相比之下,SSMix在應(yīng)用混合時(shí)可以考慮單個(gè)字符的特性舰蟆。 -SSMix 及其變體的消融研究結(jié)果表明趣惠,隨著對片段約束和顯著性信息的增加,性能有所提高身害。在混合操作中添加片段約束受益于更好的可定位能力味悄,并且大多數(shù)顯著的片段與相應(yīng)的標(biāo)簽有更多的關(guān)系,而丟棄最小顯著的片段塌鸯,這些片段相對于原始標(biāo)簽在語義上不重要侍瑟。其中,引入顯著性信息對精度的貢獻(xiàn)相對高于片段約束丙猬。

代碼實(shí)現(xiàn)

import copy

import random

import torch

import torch.nn.functional as F

from .saliency import get_saliency

class SSMix:

? ? def __init__(self, args):

? ? ? ? self.args = args

? ? def __call__(self, input1, input2, target1, target2, length1, length2, max_len):

? ? ? ? batch_size = len(length1)

? ? ? ? if self.args.ss_no_saliency:

? ? ? ? ? ? if self.args.ss_no_span:

? ? ? ? ? ? ? ? inputs_aug, ratio = self.ssmix_nosal_nospan(input1, input2, length1, length2, max_len)

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? inputs_aug, ratio = self.ssmix_nosal(input1, input2, length1, length2, max_len)

? ? ? ? else:

? ? ? ? ? ? assert not self.args.ss_no_span

? ? ? ? ? ? input2_saliency, input2_emb, _ = get_saliency(self.args, input2, target2)

? ? ? ? ? ? inputs_aug, ratio = self.ssmix(batch_size, input1, input2,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? length1, length2, input2_saliency, target1, max_len)

? ? ? ? return inputs_aug, ratio

? ? def ssmix(self, batch_size, input1, input2, length1, length2, saliency2, target1, max_len):

? ? ? ? inputs_aug = copy.deepcopy(input1)

? ? ? ? for i in range(batch_size):? # cut off length bigger than max_len ( nli task )

? ? ? ? ? ? if length1[i].item() > max_len:

? ? ? ? ? ? ? ? length1[i] = max_len

? ? ? ? ? ? ? ? for key in inputs_aug.keys():

? ? ? ? ? ? ? ? ? ? inputs_aug[key][i][max_len:] = 0

? ? ? ? ? ? ? ? inputs_aug['input_ids'][i][max_len - 1] = 102

? ? ? ? saliency1, _, _ = get_saliency(self.args, inputs_aug, target1)

? ? ? ? ratio = torch.ones((batch_size,), device=self.args.device)

? ? ? ? for i in range(batch_size):

? ? ? ? ? ? l1, l2 = length1[i].item(), length2[i].item()

? ? ? ? ? ? limit_len = min(l1, max_len) - 2? # mixup except [CLS] and [SEP]

? ? ? ? ? ? mix_size = max(int(limit_len * (self.args.ss_winsize / 100.)), 1)

? ? ? ? ? ? if l2 < mix_size:

? ? ? ? ? ? ? ? ratio[i] = 1

? ? ? ? ? ? ? ? continue

? ? ? ? ? ? saliency1_nopad = saliency1[i, :l1].unsqueeze(0).unsqueeze(0)

? ? ? ? ? ? saliency2_nopad = saliency2[i, :l2].unsqueeze(0).unsqueeze(0)

? ? ? ? ? ? saliency1_pool = F.avg_pool1d(saliency1_nopad, mix_size, stride=1).squeeze(0).squeeze(0)

? ? ? ? ? ? saliency2_pool = F.avg_pool1d(saliency2_nopad, mix_size, stride=1).squeeze(0).squeeze(0)

? ? ? ? ? ? # should not select first and last

? ? ? ? ? ? saliency1_pool[0], saliency1_pool[-1] = 100, 100

? ? ? ? ? ? saliency2_pool[0], saliency2_pool[-1] = -100, -100

? ? ? ? ? ? input1_idx = torch.argmin(saliency1_pool)

? ? ? ? ? ? input2_idx = torch.argmax(saliency2_pool)

? ? ? ? ? ? inputs_aug['input_ids'][i, input1_idx:input1_idx + mix_size] = \

? ? ? ? ? ? ? ? input2['input_ids'][i, input2_idx:input2_idx + mix_size]

? ? ? ? ? ? ratio[i] = 1 - (mix_size / (l1 - 2))

? ? ? ? return inputs_aug, ratio

? ? def ssmix_nosal(self, input1, input2, length1, length2, max_len):

? ? ? ? inputs_aug = copy.deepcopy(input1)

? ? ? ? ratio = torch.ones((len(length1),), device=self.args.device)

? ? ? ? for idx in range(len(length1)):

? ? ? ? ? ? if length1[idx].item() > max_len:

? ? ? ? ? ? ? ? for key in inputs_aug.keys():

? ? ? ? ? ? ? ? ? ? inputs_aug[key][idx][max_len:] = 0

? ? ? ? ? ? ? ? inputs_aug['input_ids'][idx][max_len - 1] = 102? # artificially add EOS token.

? ? ? ? ? ? l1, l2 = min(length1[idx].item(), max_len), length2[idx].item()

? ? ? ? ? ? if self.args.ss_winsize == -1:

? ? ? ? ? ? ? ? window_size = random.randrange(0, l1)? # random sampling of window_size

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? # remove EOS & SOS when calculating ratio & window size.

? ? ? ? ? ? ? ? window_size = int((l1 - 2) *

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? self.args.ss_winsize / 100.) or 1

? ? ? ? ? ? if l2 <= window_size:

? ? ? ? ? ? ? ? ratio[idx] = 1

? ? ? ? ? ? ? ? continue

? ? ? ? ? ? start_idx = random.randrange(0, l1 - window_size)? # random sampling of starting point

? ? ? ? ? ? if (l2 - window_size) < start_idx:? # not enough text for reference.

? ? ? ? ? ? ? ? ratio[idx] = 1

? ? ? ? ? ? ? ? continue

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? ref_start_idx = start_idx

? ? ? ? ? ? mix_percent = float(window_size) / (l1 - 2)

? ? ? ? ? ? for key in input1.keys():

? ? ? ? ? ? ? ? inputs_aug[key][idx, start_idx:start_idx + window_size] = \

? ? ? ? ? ? ? ? ? ? input2[key][idx, ref_start_idx:ref_start_idx + window_size]

? ? ? ? ? ? ratio[idx] = 1 - mix_percent

? ? ? ? return inputs_aug, ratio

? ? def ssmix_nosal_nospan(self, input1, input2, length1, length2, max_len):

? ? ? ? batch_size, n_token = input1['input_ids'].shape

? ? ? ? inputs_aug = copy.deepcopy(input1)

? ? ? ? len1 = length1.clone().detach()

? ? ? ? ratio = torch.ones((batch_size,), device=self.args.device)

? ? ? ? for i in range(batch_size): # force augmented output length to be no more than max_len

? ? ? ? ? ? if len1[i].item() > max_len:

? ? ? ? ? ? ? ? len1[i] = max_len

? ? ? ? ? ? ? ? for key in inputs_aug.keys():

? ? ? ? ? ? ? ? ? ? inputs_aug[key][i][max_len:] = 0

? ? ? ? ? ? ? ? inputs_aug['input_ids'][i][max_len - 1] = 102

? ? ? ? ? ? mix_len = int((len1[i] - 2) * (self.args.ss_winsize / 100.)) or 1

? ? ? ? ? ? if (length2[i] - 2) < mix_len:

? ? ? ? ? ? ? ? mix_len = length2[i] - 2

? ? ? ? ? ? flip_idx = random.sample(range(1, min(len1[i] - 1, length2[i] - 1)), mix_len)

? ? ? ? ? ? inputs_aug['input_ids'][i][flip_idx] = input2['input_ids'][i][flip_idx]

? ? ? ? ? ? ratio[i] = 1 - (mix_len / (len1[i].item() - 2))

? ? ? ? return inputs_aug, ratio

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涨颜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茧球,更是在濱河造成了極大的恐慌庭瑰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抢埋,死亡現(xiàn)場離奇詭異弹灭,居然都是意外死亡督暂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門穷吮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逻翁,“玉大人,你說我怎么就攤上這事捡鱼“嘶兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵驾诈,是天一觀的道長辽社。 經(jīng)常有香客問我,道長翘鸭,這世上最難降的妖魔是什么滴铅? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮就乓,結(jié)果婚禮上汉匙,老公的妹妹穿的比我還像新娘。我一直安慰自己生蚁,他們只是感情好噩翠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邦投,像睡著了一般伤锚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上志衣,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天屯援,我揣著相機(jī)與錄音,去河邊找鬼念脯。 笑死狞洋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绿店。 我是一名探鬼主播吉懊,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼假勿!你這毒婦竟也來了借嗽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤转培,失蹤者是張志新(化名)和其女友劉穎恶导,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堡距,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甲锡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羽戒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缤沦。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖易稠,靈堂內(nèi)的尸體忽然破棺而出缸废,到底是詐尸還是另有隱情,我是刑警寧澤驶社,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布企量,位于F島的核電站,受9級特大地震影響亡电,放射性物質(zhì)發(fā)生泄漏届巩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一份乒、第九天 我趴在偏房一處隱蔽的房頂上張望恕汇。 院中可真熱鬧,春花似錦或辖、人聲如沸瘾英。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缺谴。三九已至,卻和暖如春耳鸯,著一層夾襖步出監(jiān)牢的瞬間湿蛔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工县爬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煌集,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓捌省,卻偏偏與公主長得像苫纤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子纲缓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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