Slide 1

Slide 1 text

東工大Swallowプロジェクトにおける 大規模日本語Webコーパスの構築 第6回 Data-Centric AI 勉強会 服部 翔 東京工業大学 情報工学系 岡崎研究室 [email protected]

Slide 2

Slide 2 text

自己紹介 服部 翔 Kakeru Hattori 東京工業大学 情報理工学院 情報工学系知能情報コース 岡崎研究室 修士1年 2023年3月 言語処理学会第29回年次大会(NLP2023) 『クエリ指向要約におけるクエリと要約の統合的な生成』(日立製作所賞) 2023年7月頃〜 東工大Swallowプロジェクトに参加 その他 Web開発(インターン),競プロ(青・休止中) 2 @ayase_lab Kakeru Hattori

Slide 3

Slide 3 text

発表内容 1. 東工大Swallowプロジェクトとは? 2. Swallowコーパス・Common Crawlとは? 3. コーパス構築の手順 特に,日本語テキストの抽出やフィルタリングについて重点的に紹介 3

Slide 4

Slide 4 text

Swallowプロジェクト

Slide 5

Slide 5 text

Swallowプロジェクトとは? 5 東工大の 岡崎研究室 と 横田研究室 で LLM(Swallow)を研究・開発 https://chokkan.org/temp/tokyotech-llm/

Slide 6

Slide 6 text

Swallowプロジェクトのメンバー 6 メンバーのうち,岡崎研所属の一部がコーパス構築を担当

Slide 7

Slide 7 text

Swallowのbaseモデルはパラメータ数に対して高い日本語能力を発揮 7 ※2023年12月現在

Slide 8

Slide 8 text

独自の日本語Webコーパスを用いた継続事前学習で日本語能力を改善 8 3つのキーポイント 1. 継続事前学習によるLlama2の日本語能力の大幅な改善 2. 語彙拡張による大規模言語モデルの学習・推論効率の改善 3. 大規模な日本語Webコーパスの開発

Slide 9

Slide 9 text

Swallowコーパスの構築

Slide 10

Slide 10 text

SwallowコーパスはCommon Crawlから日本語テキストを抽出・精錬 10 Swallowコーパス ● Common Crawl から独自に日本語テキストを抽出・精錬して構築 ● 日本語コーパスの中で,商用利用可能なものとしては最大 😭 日本語は小規模 😱 低品質なテキスト 😭 商用利用できない Swallowコーパス

Slide 11

Slide 11 text

Common Crawlは商用利用可能な最大規模のWebクローリングデータ 11 Common Crawl ● Webサイトをクローリングしたアーカイブを無償提供している非営利団体 ● 現時点でアクセス可能なアーカイブの総量は 251,325,355,174 ページ 近年は安定的な収集量 日本語の割合は約5% 出典:https://commoncrawl.github.io/cc-crawl-statistics/plots/crawlsize 公式の統計情報を元に独自にグラフ作成

Slide 12

Slide 12 text

テキストはフィルタリングにより全体のわずか0.27%にまで精錬 12 日本語テキスト(≒5%)をさらに処理して高品質なコーパスを構築 日本語は全体の約5%程度 良質な日本語テキストを抽出 すると全体の約0.27%に

Slide 13

Slide 13 text

Swallowコーパスの構築ステップ 13 ❶ Swallow-RAW テキスト抽出 + 日本語判定 ❷ Swallow-CLEAN フィルタリング + 重複除去 ❸ Swallow-NORM 正規化 + フッター除去 WARCファイルの取得 Step 1 迅速な日本語テキスト判定 Step 2 テキスト抽出(Trafilatura) Step 3 精密な日本語テキスト判定 Step 4 品質に基づくフィルタリング Step 5 重複除去(deduplication) Step 6 ホスト名でのフィルタリング Step 7 句読点の正規化 Step 8 フッターの除去 Step 9 63,352,266,406ページ(2020年〜) lang属性とタイトル文のみを活用 HTMLからテキスト部分を抽出 線形分類器で正確に日本語を識別 n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用 NFKC正規化適用の為の下処理 Trafilaturaで残った部分を除去

Slide 14

Slide 14 text

コーパス構築❶:テキスト抽出 + 日本語判定

Slide 15

Slide 15 text

Swallowコーパスの構築ステップ - ❶ Swallow-RAW 15 ❶ Swallow-RAW テキスト抽出 + 日本語判定 ❷ Swallow-CLEAN フィルタリング + 重複除去 ❸ Swallow-NORM 正規化 + フッター除去 WARCファイルの取得 Step 1 迅速な日本語テキスト判定 Step 2 テキスト抽出(Trafilatura) Step 3 精密な日本語テキスト判定 Step 4 品質に基づくフィルタリング Step 5 重複除去(deduplication) Step 6 ホスト名でのフィルタリング Step 7 句読点の正規化 Step 8 フッターの除去 Step 9 63,352,266,406ページ(2020年〜) lang属性とタイトル文のみを活用 HTMLからテキスト部分を抽出 線形分類器で正確に日本語を識別 n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用 NFKC正規化適用の為の下処理 Trafilaturaで残った部分を除去

Slide 16

Slide 16 text

Common CrawlのデータはURLベースで取得可能 16 ● URLの構成イメージ(AWSのS3バケットの例) ○ s3://commoncrawl/crawl-data/[クロール期間名]/[ファイル名] ● 約 100 個 の クロール期間(例:2023年11月〜12月) ● 1つの クロール期間 につき,約 80,000 個 の WARCファイル ● 1つの WARCファイル につき,約 50,000 個 の Webページ 期間ごとに ファイル一覧を取得 出典:https://commoncrawl.org/get-started

Slide 17

Slide 17 text

WARC形式はテキスト抽出が必要だが,高い品質を実現できる 17 Common Crawlからダウンロードできるファイル形式は主に2つあるが...... 項目 WET形式 WARC形式 データ形式 抽出済みのテキスト HTML テキスト抽出の必要性 なし あり テキスト品質 低い (適切に抽出すれば)高い 日本語コーパス例 CC-100,mC4,OSCAR Swallowコーパス ➔ 既存のWET形式経由の日本語コーパスよりも高い品質で抽出!

Slide 18

Slide 18 text

テキスト抽出と日本語判定どちらを先に行うか問題 18 ● HTMLからのテキスト抽出(Trafilatura)にはやや長い時間を要する ● そもそも日本語は全体の5%なので先に処理数を減らしたい ● 先にテキスト抽出しないと日本語判定器が上手く機能しない ○ HTMLタグに英字が含まれるので,「純」日本語ではなくなってしまう ➔ HTML形式のままで「大雑把に」日本語判定がしたい! 🤔🤔🤔

Slide 19

Slide 19 text

Step 2 迅速な日本語判定は一部の日本語テキストを捨てるが、処理高速化に有効 19 テキスト抽出前にいずれか2つを満たすものを日本語と判定 1. HTMLのlang属性が ”ja” である 2. HTMLのtitle要素のテキストが日本語である(判定器使用) 適合率 0.89/再現率 0.97/F1スコア 0.926 ➔ 処理時間削減(約14分の1)のメリットの方が上回ると判断 迅速な日本語テキスト判定 テキスト抽出(Trafilatura) Step 3 精密な日本語テキスト判定 Step 4 lang属性とタイトル文のみを活用 HTMLからテキスト部分を抽出 線形分類器で正確に日本語を識別

Slide 20

Slide 20 text

Step 4 日本語判定器を学習してより正確に日本語テキストを残す 20 ● 日本語は記号のみで十分に判定できる(意味埋め込みは不要) ● 文字n-gramを特徴量に用いて,SVMをWikipediaで学習 ○ 全言語の学習データから上位400,000件 ○ 日本語の学習データから上位400,000件 ○ 中国語の学習データから上位100,000件 ○ その他各言語の学習データから上位10,000件 Step 2 迅速な日本語テキスト判定 テキスト抽出(Trafilatura) Step 3 精密な日本語テキスト判定 lang属性とタイトル文のみを活用 HTMLからテキスト部分を抽出 線形分類器で正確に日本語を識別

Slide 21

Slide 21 text

現状では FastText が最もコストパフォーマンスに優れた選択肢 21 ● 本研究で独自に用意した判定器よりもFastTextの方が総合的に上回る ○ (実装時にFastTextとの性能比較を行っていなかった) ● FastTextのパラメータを調整して使用するのが低コストかつ高速

Slide 22

Slide 22 text

参考:HTMLをTrafilaturaでテキスト抽出し,日本語判定する例 22 岡崎研究室のWebサイト → 精密な日本語判定ではスコア 336.33(正) ● 迅速な日本語判定において,タイトル(配属希望の方へ | Okazaki Laboratory at Tokyo Institute of Technology) は スコア -8.86(負)だが,lang=”ja” が入っているのでフィルタされない 抽出

Slide 23

Slide 23 text

コーパス構築❷:フィルタリング + 重複除去

Slide 24

Slide 24 text

Swallowコーパスの構築ステップ - ❷ Swallow-CLEAN 24 ❶ Swallow-RAW テキスト抽出 + 日本語判定 ❷ Swallow-CLEAN フィルタリング + 重複除去 ❸ Swallow-NORM 正規化 + フッター除去 WARCファイルの取得 Step 1 迅速な日本語テキスト判定 Step 2 テキスト抽出(Trafilatura) Step 3 精密な日本語テキスト判定 Step 4 品質に基づくフィルタリング Step 5 重複除去(deduplication) Step 6 ホスト名でのフィルタリング Step 7 句読点の正規化 Step 8 フッターの除去 Step 9 63,352,266,406ページ(2020年〜) lang属性とタイトル文のみを活用 HTMLからテキスト部分を抽出 線形分類器で正確に日本語を識別 n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用 NFKC正規化適用の為の下処理 Trafilaturaで残った部分を除去

Slide 25

Slide 25 text

Step 5 Step 6 Step 7 繰り返し表現の多い文書や低品質な文書をルールベースで除去 25 ● 繰り返し表現は,※n-gramベースのルール等で不適切な文書を除去 ○ LLMが同じ単語を繰り返し生成するのを防止するため ○ 例:(最頻出の◯gramの出現回数/全◯gramの出現回数) ≧ 0.2 ● 日本語の品質については,※独自のルールを適用 ○ 例❶:平仮名の文字が20%未満,カタカナの文字が50%以上 ○ 例❷:NG表現(Hentai Wordなど)の文字割合が5%以上 品質に基づくフィルタリング 重複除去(deduplication) ホスト名でのフィルタリング n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用 ※フィルタリングの全ルール一覧は補足資料❶に掲載

Slide 26

Slide 26 text

重複除去(deduplication)によりコーパスの「丸暗記」を防止する 26 ● Common Crawlは同一のWebサイトを異なる時期に巡回する ➔ LLMがコーパスを「丸暗記」しないよう、重複は除去 ● 重複除去は,※MinHash による特徴量集合の重複判定で行う ○ 全ての文書を文字5-gramの特徴量集合に変換し,一致度を近似計算 ※MinHashによる重複検知アルゴリズムの詳細は補足資料❷で解説 Step 5 Step 6 Step 7 品質に基づくフィルタリング 重複除去(deduplication) ホスト名でのフィルタリング n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用

Slide 27

Slide 27 text

重複除去を行うと,古い時期のクローリングは20%程度しか残らない 27 重複した場合は新しい方を残すため,古い時期の文書はかなり少なくなる Step 5 Step 6 Step 7 品質に基づくフィルタリング 重複除去(deduplication) ホスト名でのフィルタリング n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用 〜2022年は20%程度しか残らない!

Slide 28

Slide 28 text

ホスト名に基づくフィルタリングで有害な文書をさらに除去する 28 ● Step 5 に加えて,さらにホスト名ベースで有害な文書を除去 ○ UT1 blocklist に収録されている ○ 出会い系サイトのサービス名が含まれるページの割合が0.1%以上 ○ 全ページのテキストに対してNG表現を含む割合が0.5%以上 ○ *wikipedia.org ○ *.5ch.net Step 5 Step 6 Step 7 品質に基づくフィルタリング 重複除去(deduplication) ホスト名でのフィルタリング n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用 日本語文書に特化した オリジナルのルールを追加

Slide 29

Slide 29 text

コーパス構築❸:正規化 + フッター除去

Slide 30

Slide 30 text

Swallowコーパスの構築ステップ - ❸ Swallow-NORM 30 ❶ Swallow-RAW テキスト抽出 + 日本語判定 ❷ Swallow-CLEAN フィルタリング + 重複除去 ❸ Swallow-NORM 正規化 + フッター除去 WARCファイルの取得 Step 1 迅速な日本語テキスト判定 Step 2 テキスト抽出(Trafilatura) Step 3 精密な日本語テキスト判定 Step 4 品質に基づくフィルタリング Step 5 重複除去(deduplication) Step 6 ホスト名でのフィルタリング Step 7 句読点の正規化 Step 8 フッターの除去 Step 9 63,352,266,406ページ(2020年〜) lang属性とタイトル文のみを活用 HTMLからテキスト部分を抽出 線形分類器で正確に日本語を識別 n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用 NFKC正規化適用の為の下処理 Trafilaturaで残った部分を除去

Slide 31

Slide 31 text

NFKC正規化の前に日本語特有の句読点問題に対処する&フッターの除去 31 ● NFKC正規化 ○ 全角・半角のアルファベットや仮名・カタカナ,記号を正規化 ● 日本語特有の句読点の使い分けを考慮し,事前に「、。」に統一 ○ 「、」より「,」の出現回数が多ければ,「、」に統一 ○ 「。」より「.」の出現回数が多ければ、「。」に統一 ● フッターの典型的な表現を除去 ○ 例:「無断転載を禁ず」,「この記事へのトラックバック一覧」

Slide 32

Slide 32 text

総括

Slide 33

Slide 33 text

まとめ:Swallowコーパスの構築ステップ(再掲) 33 ❶ Swallow-RAW テキスト抽出 + 日本語判定 ❷ Swallow-CLEAN フィルタリング + 重複除去 ❸ Swallow-NORM 正規化 + フッター除去 WARCファイルの取得 Step 1 迅速な日本語テキスト判定 Step 2 テキスト抽出(Trafilatura) Step 3 精密な日本語テキスト判定 Step 4 品質に基づくフィルタリング Step 5 重複除去(deduplication) Step 6 ホスト名でのフィルタリング Step 7 句読点の正規化 Step 8 フッターの除去 Step 9 63,352,266,406ページ(2020年〜) lang属性とタイトル文のみを活用 HTMLからテキスト部分を抽出 線形分類器で正確に日本語を識別 n-gramや独自のルールベース MinHashを用いた類似文書の除去 ブロックリストやNG表現の活用 NFKC正規化適用の為の下処理 Trafilaturaで残った部分を除去

Slide 34

Slide 34 text

Step 1 Step 7 Step 4 Step 2 まとめ:先行研究(RefinedWeb)との差分 34 WARCファイルの取得 Step 1 迅速な日本語テキスト判定 テキスト抽出(Trafilatura) Step 3 精密な日本語テキスト判定 品質に基づくフィルタリング Step 5 重複除去(deduplication) Step 6 ホスト名でのフィルタリング 句読点の正規化 Step 8 フッターの除去 Step 9 ホスト名でのフィルタリング テキスト抽出(Trafilatura) Step 2 英語テキスト判定 Step 3 品質に基づくフィルタリング Step 4 行内の修正 Step 5 重複除去(deduplication) Step 6 正確な重複除去 Step 7 RefinedWeb https://arxiv.org/abs/2306.01116 UT1 blocklistが そのまま使えた 日本語に特化した 処理を追加 ファイル数が 多い中での工夫

Slide 35

Slide 35 text

参考:品質の高い独自コーパスを使用した効果は確かに出ている 35 ● Llama2(13B base)に対して,各日本語コーパスで継続事前学習を実施 ○ 約104.9BTの学習データのうち,90%を日本語とした ○ さらに日本語のうち約1.6BTをWikipedia,残りを各日本語コーパスとした

Slide 36

Slide 36 text

Swallowプロジェクトの展望 36 ● 今後も引き続き,LLMの開発を続けていく ○ 英語の性能がLlama2より下がった原因の調査 ○ Instruction-Tuningによる性能向上を目指す ● コーパスについては,安全性の向上に改善の余地あり ● 言語処理学会年次大会(NLP2024)にも論文投稿&発表予定 ○ 継続事前学習,日本語語彙拡張,コーパス構築の計3本

Slide 37

Slide 37 text

補足資料❶:文書の品質に基づくフィルタリングの詳細

Slide 38

Slide 38 text

文書の品質に基づくフィルタリングの詳細(1) 38 重複した表現を多く含む文書の削除 先行研究(MassiveWeb)のルールをそのまま採用 ● 他の行と重複する行数 / 全行数(0.30) ● 他の段落と重複する段落数 / 全段落数(0.30) ● 他の行と重複する行に含まれる文字数 / 全文字数 (0.20) ● 他の段落と重複する段落に含まれる文字数 / 全文字数 (0.20) ● 最頻出の 2-gram の出現回数 / 全 2-gram の出現回数 (0.20) ● 最頻出の 3-gram の出現回数 / 全 3-gram の出現回数 (0.18) ● 最頻出の 4-gram の出現回数 / 全 4-gram の出現回数 (0.16) ● 2 回以上出現する 5-gram の総出現回数 / 全5-gram の総出現回数 (0.15) ● 2 回以上出現する 6-gram の総出現回数 / 全6-gram の総出現回数 (0.14) ● 2 回以上出現する 7-gram の総出現回数 / 全7-gram の総出現回数 (0.13) ● 2 回以上出現する 8-gram の総出現回数 / 全8-gram の総出現回数 (0.12) ● 2 回以上出現する 9-gram の総出現回数 / 全9-gram の総出現回数 (0.11) ● 2 回以上出現する 10-gram の総出現回数 / 全10-gram の総出現回数 (0.10)

Slide 39

Slide 39 text

文書の品質に基づくフィルタリングの詳細(2) 39 低品質な日本語を含む文書の削除 ● 文字数 (400 文字未満) ● 平仮名の文字の割合 (0.2 未満) ● カタカナの文字の割合 (0.5 以上) ● 日本語の文字 (平仮名,カタカナ,漢字,句読点)の割合 (0.5 未満) ● 文書中の文の文字数の平均 (20 未満,もしくは90 よりも多い場合) ● 最も長い文の文字数 (200 文字以上) ● 文末が省略記号で終わる文の割合 (0.2 以上)

Slide 40

Slide 40 text

補足資料❷:重複除去を実現するアルゴリズムの詳細

Slide 41

Slide 41 text

集合の類似度を測るJaccard係数はMinHashで近似的に計算できる 41 2つの文書に共通する特徴量数 2つの文書の合計特徴量数 Jaccard係数 2つの文書の類似度を測る指標(0〜1) 計算量が膨大なので近似計算したい...... あるハッシュ関数における 全要素のハッシュ値の最小値 MinHashベースで Jaccard係数が求まる! 計算量 多 計算量 少

Slide 42

Slide 42 text

MinHashの一致は「最小のハッシュ値を取る特徴量が共通であるか」と同義 42 文書A 特徴量名 Hash値 f3 0.1(1位) f1 0.3(3位) f5 0.4(4位) f2 0.7(7位) f4 0.8(8位) 文書B 特徴量名 Hash値 f3 0.1(1位) f7 0.2(2位) f5 0.4(4位) f6 0.5(5位) f8 0.6(6位) = MinHashの一致 最小のハッシュ 値を取るのが 共通の特徴量 であるかどうか

Slide 43

Slide 43 text

複数のハッシュ値をまとめて比較して文書の重複を判定する 43 文書の重複を判定するアルゴリズム 1. MinHash値を b 個連結したもの(バケット)を r 個作成 2. r 回の比較の中で一組でも完全一致すれば2つの文書は重複とみなす Jaccard係数 s で 重複と見なされる確率 本研究では b = 20,r = 20 とした ※ K = br の値が大きすぎると メモリ必要量や計算量が多くなり困難が伴う