Upgrade to Pro — share decks privately, control downloads, hide ads and more …

東工大Swallowプロジェクトにおける大規模日本語Webコーパスの構築

Kakeru Hattori
February 08, 2024

 東工大Swallowプロジェクトにおける大規模日本語Webコーパスの構築

『第6回 Data-Centric AI勉強会』(2024年2月9日)にて発表
https://dcai-jp.connpass.com/event/307402/

東工大岡崎研究室と横田研究室が研究・開発を行った大規模言語モデル『Swallow』の学習にあたり独自に構築した『Swallowコーパス』は、現時点で商用利用が可能な日本語の言語モデルの学習コーパスの中で最大となっています。本発表では、その概要や具体的なコーパス構築手順について紹介します。

Kakeru Hattori

February 08, 2024
Tweet

Other Decks in Research

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. Swallowプロジェクト

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  9. Swallowコーパスの構築

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  13. 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で残った部分を除去

    View full-size slide

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

    View full-size slide

  15. 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で残った部分を除去

    View full-size slide

  16. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  19. 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からテキスト部分を抽出
    線形分類器で正確に日本語を識別

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    スコア -8.86(負)だが,lang=”ja” が入っているのでフィルタされない
    抽出

    View full-size slide

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

    View full-size slide

  24. 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で残った部分を除去

    View full-size slide

  25. 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表現の活用
    ※フィルタリングの全ルール一覧は補足資料❶に掲載

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  28. ホスト名に基づくフィルタリングで有害な文書をさらに除去する 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表現の活用
    日本語文書に特化した
    オリジナルのルールを追加

    View full-size slide

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

    View full-size slide

  30. 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で残った部分を除去

    View full-size slide

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

    View full-size slide

  32. まとめ: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で残った部分を除去

    View full-size slide

  33. 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が
    そのまま使えた
    日本語に特化した
    処理を追加
    ファイル数が
    多い中での工夫

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  37. 文書の品質に基づくフィルタリングの詳細(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)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    計算量

    View full-size slide

  41. 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の一致
    最小のハッシュ
    値を取るのが
    共通の特徴量
    であるかどうか

    View full-size slide

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

    View full-size slide