Polarsのsortはどこに実装されているのか ~デバッグの仕方を添えて~

はじめに

この記事はPolars Adbent Calendar 2023 22日目の記事です。

Polarsの公式より引用

本記事では、Python版のPolarsについて話します。

Polarsは動作が早いです。Polarsが高速に動作する要因は複数ありますが、その一つに高速に動作するRustで書かれているから、というものがあります。

Python上でPolarsを扱う際にもこのRustの恩恵にあずかれるということは、Rustの実装をPython上で呼び出せるような仕組みがどこかにあるはずです。

この、別の言語間で相互で呼び出せるようにする仕組みのことをバインディングと呼びます。今回はPythonとRust間のため、Python↔︎Rustバインディングの仕組みが存在することになります。

PolarsではPython↔︎Rustバインディングとして、PyO3とmaturinが利用されています。

Polarsの実装を追っていると、このバインディングの仕組みを理解しないと実装を追えない場面が多々出てきます。今回はsortを例に、このPyO3/maturinがどのように用いられているか理解し、Polarsの実装を可能な限り追ってみることにします。

注: 私のRustの知識不足もあり、Rust側の実装を追うパートは怪しい内容になっています。わかる方いたら追記しますので是非教えてください。

PyO3とmaturinとは何か?

PyO3はRustとPythonバインディング機能を提供するライブラリです。

maturinはRustをPythonパッケージとしてビルドし、publishするためのライブラリです。以下の図がその関係性を分かりやすく表しています。引用元

システム開発におけるmaturinとPyO3の関係

実装が追えなくなる場面

今回は、polars.DataFrameのsort機能を使う場面で説明します。以下のコードはPolarsのバージョン0.20.2です。

例えば、以下のようなコードがあるとします。

import polars as pl

df = pl.DataFrame("../input/titanic.csv")

df.sort("fare")

titanic.csvは、Kaggleなどで用いられるタイタニックの乗船客のデータです。 タイタニックの乗船客のデータをfare(料金)ごとにsortする非常にシンプルなコードです。

では、df.sort("fare")の中ではどのような実装をしているかを見ていきましょう。

VSCodeでのデバッグを行なっていきます。df.sort("fare")の行にbreakpointを打ち、↓(Step Into)を行います。

sortを行う

Step Intoをすると、Polarsライブラリの実装を見に行くことになります。ただし、VSCodeデバッグは、デフォルトでは外部ライブラリの実装を見に行かないため、VSCodeデバッグの設定ファイルであるlaunch.jsonの設定を変更します。

まず、下記の歯車ボタンを押します。

歯車を押す

すると、launch.jsonが立ち上がるので、justMyCodeの部分をtrueからfalseに変更しましょう。

launch.json

無事、Polarsの実装を見に行けると、以下のような画面になると思います。

sort

sortの中では

(
    self.lazy()
    .sort(by, *more_by, descending=descending, nulls_last=nulls_last)
    .collect(_eager=True)
)

というようなコードが行われていたんですね。.lazy().collect(_eager=True)はlazy APIのためのコードのため、sortは.sort(by, *more_by, descending=descending, nulls_last=nulls_last)で行われていることになります。

では.sortの中身を見てみましょう。Step Over(左から2番目、時計回りの矢印)を一度クリックし、.sortがハイライトされた状態にします。

Step Over

上記画面になったら、再度↓(Step Into)を行います。今回は5-6回↓ボタンを押す必要があると思います。すると以下のような画面にいきます。

LazyFrameのsort

おそらく、sortの処理は、self._ldf.sort(by, descending, nulls_last, maintain_order)で行われていそうだと分かります。sortself._ldfのメソッドのようですが、self._ldfとはなんでしょうか?こういう時はVSCodeの「Go To Definition」が便利です。_ldfをダブルクリックし、右クリックで表示されるメニューから「Go To Definition」を選択します。

Go To Definition

すると、_ldf: PyLazyFrameという実装が見つかります。

_ldfの実装元

今度はPyLazyFrameが何かという話になりますね。再度「Go To Definition」を行います。

追えない図

あれ?追えません。仕方ないのでCtrl + FでPyLazyFrameを検索しましょう。

すると、以下のようなコードが見つかりますが、VSCodeシンタックスハイライトが機能していません。

PyLazyFrameの呼び出し元

そう、このfrom polars.polars import PyLazyFrameこそが、PolarsがRustで書かれた実装をPyO3/maturinを用いてPythonモジュールとして呼び出されている箇所なのです。

つまり、sortの実装の本体を追いたければ、from polars.polars import PyLazyFrameがどこから呼び出されているのかを知り、PyLazyFrameに対してsortメソッドを用いた場合にどのコードが呼ばれるかを知る必要があるわけです。これは大変だ。

大変な時の顔

Polarsにおいて、PyO3/maturinが使われている箇所、およびその読み方

というわけで、課題感としては「Python側の実装で呼び出されているRustの実装が追えない」ということにありました。 ここからはRust側の実装を追ってみましょう。

まず前提知識なのですが、Rustはパッケージを作る際、Cargo.tomlというそれらのクレート(バイナリかライブラリ)をどのようにビルドするかを説明するファイルを持ちます。また、src/main.rs が、パッケージと同じ名前を持つバイナリクレートのクレートルートであるという慣習があります。同じようにCargoはパッケージディレクトリにsrc/lib.rs が含まれていたら、パッケージにはパッケージと同じ名前のライブラリクレートが含まれており、src/lib.rs がそのクレートルートなのだと判断します。

参考: doc.rust-jp.rs

src配下にsrc/main.rsかsrc/lib.rsのどちらかがあれば、そこからパッケージが呼び出されているはず、ということになります。

では、GitHubの画面で見てみましょう。Linkはこちら

PolarsのGitHub

src/main.rsはなく、src/lib.rsがあるこが分かります。

では次に、src/lib.rsの中身を確認します。上から辿っていくと、fn polarsというそれっぽい実装がされている箇所が見つかります。

PyO3/maturinが利用されている箇所

ここが、PyO3によってPython↔︎Rustバインディングを行なっている箇所になります。#[pymodule]で指定されたモジュールがPythonにエクスポートされます。m.add_class::<PyLazyFrame>().unwrap();とあるため、PyLazyFrameもここでpolarsのクラスとして追加されていることが分かります。つまり、このPyLazyFrameが、先ほどPython側でも利用したモジュールになるはずです。

参考:

pyo3.rs

PyLazyFrameがどこから呼び出されているかを再度検索すると、use crate::lazyframe::PyLazyFrame;と呼び出されていました。

Rustでcrateから呼び出されている場合は、クレートルート(この場合はsrc/lib.rs)からの呼び出しになるため、crate::lazyframesrc/lazyframe.rsで実装されていることになります。

そのため、今度はsrc/lazyframe.rsを見ていきます。Linkはこちら

コードを上から追っていくと、sortメソッドらしきものが見つかります。

sort ・・・?

「これが我々が追い求めていたsortの実装!?」と喜ぶのは束の間、このsortはself.ldfのメソッドを呼んでいるだけのメソッドだと分かります。 このself.ldfを検索を行うと、以下のself.ldf = LazyFrame::from(lp);という実装で呼び出されていそうです。そしてこのlpはLogicalPlanという型で実装されています。

self.ldfの呼び出し元

(ここからはRustの知識不足に伴い、かなり怪しいです。間違っていたらぜひ教えてください。)

このLogicalPlanがどこで実装されているかを調べていくと以下のようなコードが見つかります。Linkはこちら

LogicalPlanBuilder

このコードの意味をChatGPTに聞くと、

LogicalPlanBuilder という名前の公開構造体(pub struct)を定義しています。この構造体は、LogicalPlan(論理計画)を公開フィールドとして持っており、これにより他のコードからアクセス可能になります。

と回答がありました。つまり、LogicalPlangはLogicalPlanBuilderによって構築されると考えられます。

このLogicalPlanBuilderの実装の中から、sortメソッドらしきものを探すと、以下が見つかります。コードはこちら

我々が追い求めてたsort?

このコードをChatGPTに説明してもらうと

このコードは、Polarsデータフレームライブラリの一部で、LogicalPlanBuilderのsortメソッドを定義しています。このメソッドはソート操作の論理計画を作成するためのものです。パラメータとして列のベクトル(by_column)、各列が降順かどうかを示すブール値のベクトル(descending)、null値を最後にするかどうかのブール値(null_last)、そしてソートした際に元の順序を維持するかどうかのブール値(maintain_order)を取ります。これらのパラメータを使用して、ソートの論理計画を表すLogicalPlan::Sort構造体を生成し、それを元にデータフレームに対するソート操作の実行計画が立てられます。

とあるので、どうやらこれが我々が追い求めていたsortの実装・・・なんですかね?Sort構造体を作る、とあるので、まだ実装は別の部分にある気がします。

が、これ以上は追い方が分からないため、今回はここまでとします!

最後に

もしsortがどこで実装されているか分かる方がいらっしゃったらぜひ教えてください🙇‍♂️

https://twitter.com/sinchir0

論文まとめ「Soft Labels for Ordinal Regression」

URL

https://openaccess.thecvf.com/content_CVPR_2019/papers/Diaz_Soft_Labels_for_Ordinal_Regression_CVPR_2019_paper.pdf

メタ情報

  • 学会
    • CVPR2019採択
  • 著者
    • Raul Diaz, Amit Marathe
    • HP Inc.

モチベーション

  • どのようにlossや目的変数を変換しているかに興味がある

背景

  • Ordinal classification(ordinal regression)
    • 順序付きの分類問題
      • 映画の評価(1 ~ 5)の予測
        • 正解が4の時、推論結果が3と1では、明らかに3の方が近い外し方
  • 先行研究
    • K-rank method[14]
      • 各クラスを複数のバイナリ1-hot ベクトルにハードコードし、複数の二値分類器を用いて推論
    • Soft methods[41, 45, 39]
      • domain transferを実現するために、soft label distribution matching lossを利用[41]
      • 人間のアノテーションと同じ評価分布を予測する[45]
      • 年齢推定において、不確実性をガウス分布で表現し、soft softmax関数を用いて、「周辺の年齢区間」も考慮に入れる[39]
    • Image ranking.
      • 年齢推定
        • オーバーフィッティングを避けるために浅い畳み込みネットワークを学習することで、独立した分類問題としてアプローチ[26]
        • K - 1個の2値分類器を持つ類似のCNNを使用、それぞれの分類器は、特定の画像入力xが、与えられた年齢閾値y > kより古い顔を含むかどうかを予測するように設計[32]
      • 順序関係を制約するために共有重みを持つ複数のVGG-16を使用するアーキテクチャを開発[30][38]
    • Monocular depth estimation.
      • 省略
    • Horizon estimation.
      • 省略

課題

  • Ordinal classificationの一般的な方法は、K-rank method
  • しかし、各データラベルを順序カテゴリまたはランクのいずれかにハードに割り当てることで、ラベルが連続ドメインに属しているという重要な情報を失う。

目的

  • 従来の分類問題として、順序回帰をフレームワーク化した、シンプルで直感的な方法を提案

手法

  • soft target encodingを用いて、順序回帰の問題を分類の問題へと変換する
  • 順序情報をground truthへ埋め込む、非常に直感的な方法

Soft Ordinal vectors (or SORD)

$$ y_i = \frac{e^{-\phi(r_t, r_i)}}{\sum_{k=1}^{K} e^{-\phi(r_t, r_k)}} \quad \forall r_i \in Y (1) $$

  • $Y = {r_1, r_2, ..., r_K​}$: $K$ 個の順序付きカテゴリ
  • $y_i$ : 特定のインスタンスがランク $r_i$ であるときの、エンコードされたベクトル $y$ の成分。
  • $ϕ(r_t​,r_i​)$ : 任意の距離(または損失)関数で、真のランク$r_t$と各ランク $r_i$ との「距離」を測定する。

  • 近傍のカテゴリは、真のクラスから遠ざかるにつれて、より小さい値を持つようになる(ただし、必ずしも0ではない)

  • $ϕ$ は解く問題に依存
    • 絶対誤差や2乗誤差、など
  • ground truthを確率分布としてエンコードすることは、cross-entropyやKullback-Leibler divergenceのようなソフトマックス出力を使用する一般的な分類損失関数とも相性が良い。
    • cross-entropyやKullback-Leibler divergenceは、出力と真のラベルのベクトル表現との間の「面積」(厳密には確率分布の間の差異)を最小化することを目指すため

Backpropagation of Metrics

  • 順序情報(ordinal information)をSORDでエンコードすることにより、カテゴリ損失関数の勾配(gradient)が簡単に計算可能
  • 前提として、cross-entropyは下記のように勾配を計算可能

    $$ \frac{\partial L}{\partial p_i} = -\frac{y_i}{p_i} $$

    • 証明
      • cross-entropyは以下のように定義される

      $$ L = -\sum_{i=1}^{K} y_i \log(p_i) $$

      • この損失関数$L$に対して、各$p_i$で偏微分すると

      $$ \frac{\partial L}{\partial p_i} = -\frac{y_i}{p_i} $$

  • cross-entropyを損失関数とし、SORD((1)式)を利用すると勾配は以下となる

    • 証明
      • まず、下記が成り立つような$C( > 0)$を定義

      • Cは、Softmaxの分母と、SORDの分母を定数項をかけて一致させるもの。

      • あとは、式変形

SORDの特性

  • 2行で実現可能
    1. $ϕ(r_t​,r_i​)$を全ての$r_i \in Y$に対して計算
    2. 全ての、$-ϕ(r_t​,r_i​)$に対し、Softmaxを計算し、soft labelを求める
  • 特定のlayerを変更する必要がないため、有名なアーキテクチャをそのまま利用可能
  • K-rank methodは複数の二値分類器を用意するためパラメータも増加したが、SORDは元と同じパラメータを維持可能
  • ドメインを目的変数に反映させやすい
      • 単眼深度推定問題で、正解が2.3mだった場合
        • $ϕ$をそのまま計算できるのであれば、計算する
        • $r_i = 2m$と$r_{(i+1)} = 3m$というカテゴリが存在するならば、SORDをなめらかにバランスさせる

結果

実験設定

タスク

  • Image aesthetics(画像品質)
    • 画像は、Nature、Animal、Urban、Peopleの4つの区分
    • 5段階の美的カテゴリーで評価

      評価 意味
      unacceptable 許容できない
      flawed 欠陥がある
      ordinary 焦点は合っているが、芸術的価値がなく普通
      professional 欠陥がない、フレーム・焦点・光よし
      exceptional 例外的に魅力的な画像
  • 年齢推定
    • 2,284人、26kの顔画像
    • レンジ
      • 0-2、4-6、8-13、15-20、25-32、38-43、48-53、60歳以上
  • Monocular Depth Estimation
    • 省略
  • Horizon Estimation
    • 省略

実験結果

設定したソフトラベル

思うところ

  • ドメイン特化型のlossにすることができそう
    • 例えば、年齢推定では、8-13を当てる問題よりも、38-43を当てる問題の方が難しいはず、この年代の方は顔で判別しづらいと思うため
    • $ϕ$を与えられたデータに基づいて決める方法が有効そう
  • future taskを書いておいて欲しかった

会話を哲学する コミュニケーションとマニピュレーション 感想

感想

  • 会話におけるコミュニケーションとマニピュレーションと言う側面を初めて理解した。
    • 我々が普段会話の中でおこなっていることは、約束事を形成したり、相手を誘導しようとすることだと気づいた。
  • 作品のストーリー・あらすじも一緒に知れるので、面白い作品の内容も合わせて楽しむことができる。
  • 例として挙げられている場面が漫画・アニメ・小説寄りで、現実にありうるのか?と言う点は気になった

コミュニケーション

  • 定義
    • 会話において、約束事を形成する側面
    • ニに告白されたヨシカが、いったいどうしたらいいかと来留美に相談している。
      1 来留美「いいと思うけどな、付き合っちゃえば。あの人よく働くし、誠実そうだし。なによりヨシカのことがすごく好きなところがいいじゃない」
    
      2 ヨシカ 「うん、いい人なんだけどね。でもやっぱり結婚は一番好きな人としたいから」
    
  • 約束事を形成する流れ
    • 会話1で、「来留美はヨシカがニと交際するのをよいことだと思っている」という約束事を形成している。
      • 約束事は、必ずしも来留美が本当に思っていることである必要はない。
    • 会話2で「ヨシカはニとの交際に乗り気でない」「ニはヨシカのいちばん好きなひとではない」という約束事を形成している
      • ここで面白いのは、言葉として「乗り気ではない」と表現していないのに、我々は「乗り気ではない」ことを解釈できる点
    • こうして、だんだんと約束事が増えていき、後続する会話は、すでにある約束事に照らして理解されるようになる
    • 「文脈」とか「会話の前提」などと呼ばれるものは、このようにしてつくられていくと考えられる。

マニピュレーション

  • 定義
    • 相手の心理や行動を、自分の望む方向へと変化させようとする
      • 悪意の有無、相手を意のままに操るという意図の有無は関係なし
    • 会話1より、来留美はヨシカに「ニと交際するのはよいことだ」と思わせようとしていると考えられる。

コミュニケーションとマニピュレーションの例

  • 淡々と事実を語っているように見せかけて自分の有能さを相手に印象づけようとする。
  • はっきりとしたコミュニケーションにはならないように注意しながらひっそりと相手の心理を誘導する。
  • あえて必要以上にきちんとコミュニケーションをすることで自分は誠実な人柄なのだと相手に思ってもらおうとする。

コミュニケーションとマニピュレーションが明確にずれる例

  • (本書には記載されていないが)ダチョウ倶楽部の「押すなよ!絶対に押すなよ!」は、コミュニケーションとしては文字通り「押さないで欲しいと思っている」と捉えられるが、マニピュレーションとしては、「押して欲しいと思っている」となり、わかりやすくコミュニケーションとマニピュレーションがずれる例である。

  • また、コミュニケーションとマニピュレーションを区別した上で、「第六章 本心を潜ませる」に記載されているONE PIECEの例を読むと、理解が深まるため、「会話を哲学する コミュニケーションとマニピュレーション」を購入された方はぜひ読んでみて欲しい。

Shift-JIS, UTF-8, CP932の違い

定期的にわからなくなるため、まとめる。

Shift-JIS

主に日本で使われる文字コードの一つで、ASCIIの英数字やいくつかの特殊文字に加えて、ほぼすべての日本語文字(漢字、ひらがな、カタカナ等)をカバーしている。しかし、その他の多くの言語や特殊な文字はカバーしていない。英数字は1バイト、日本語は主に2バイトで表現される。

Shift-JISでのバイト表現の例

「A」は0x41(16進数)、「1」は0x31と表される。これはASCIIと同じである。日本語の文字は2バイトで表現される。たとえば、「あ」は0x82A0、「漢」は0x8ABFなど。

Shift-JISが使われる事例

  • レガシーシステム

    • Shift-JISはかつて日本で広く使われていたため、古いシステムやソフトウェア、特に1990年代から2000年代初頭までのものは、Shift-JISで日本語を扱っていることが多い。
  • CSVファイル

  • ウェブページ

    • 一部の日本語のウェブページでは、まだShift-JISが使われていることがあります。特に、更新があまり行われない古いウェブサイトなどで見られる。
  • テキストエディタ

UTF-8

Unicodeを基にしていて、世界中のほとんどの言語、特殊文字をカバーしている。ASCII文字を1バイトで表現し、それ以外の文字は2バイト以上で表現する。日本語はほとんどが3バイトで表現する。また、UTF-8はASCIIとの互換性を持っていて、ASCII文字はUTF-8でも同じバイト値で表現される。

CP932

MicrosoftWindowsで使用するために開発した、日本語用の文字コードで、Shift-JISの拡張版である。Shift-JISでは表現できない一部の文字や記号を含んでいる。また、一部の文字や記号がShift-JISとは異なるコードで表現されているため、完全にShift-JISと互換性があるわけではない。

GPT4の解答

chat.openai.com

「大規模言語モデルは新たな知能か」を読みました

感想

大規模言語モデル周りの話を、非常に平易な説明で学ぶことができた。ChatGPTをきっかけにMLを学ぶ人の入門書として良さそう。短い時間で読めるのも良い。

創発の原因の仮説や、本文中(In-Context)学習をself-attentionが実現していることなど、知らないことも学べた。

引用文献を載せてくれるとより良かった。(分野の進歩の速さから、あえて外したのだとは思うが)

面白かった部分

創発が起きる原因の仮説 (p80)

モデルを大きくすると問題が急に解けるようになる、創発という

原因は解明されていないが、大きく二つの仮説がある

  • 宝くじ仮説
    • 当たりのサブネットワークが存在し、パラメータ数が増えると見つけられる確率が上がる
  • 構成属性文法仮説
    • 言語は、複数の要素から構成される(例えば単語が組み合わさり句を構成する)ため、構成性が存在する
    • データが構成性を持つ場合
      • プロンプトで指示をだし、その後続を予測する際は、
        • プロンプトの背後にある構造表現が見つけられればうまく予測
        • そうではない場合は予測は難しい
    • このことが情報理論を使って証明可能
    • データ量やモデルを大きくすると、ある段階から突然背後にある構造を見つけられる

アレックスネットの研究者は現在OpenAIにいる (p102)

  • アレックスネットの研究構想の指導者が今オープンAIにいるのは熱い。
  • 大きなニューラルネットワークを大きなデータセットで単純だが正しい学習則で学習することが大切だとアレックスネットのタイミングから考えていたらしい。

モデルサイズが大きい方が汎化性能が高くなる理由の仮説 (p105)

  • ディープラーニングにおいて、モデルサイズが大きい方が汎化性能が高くなる。理由を説明する仮説がいくつか存在する
    • 宝くじ仮説、大きなモデルは最初から上手くいくサブネットワークを持っていて、それを掘り出す
    • 平坦な最小解仮説、局所最適解ではなく、パラメータの変化に対して目的変数の値の変化が緩やかである性質を持つ=汎化している。大きなモデルを勾配降下法で最適化した場合、平坦な最小解に到達する可能性が高くなることを理論的に示せる。

本文中(In-Context)学習はself-attentionにより実現されている (p114)

  • CoTや、プロンプトに例題を与えた場合などは、大規模言語モデルがあたかも改めて学習しているように見える。これを本文中(In-Context)学習と呼ぶ。
    • 学習した内容とは別に、処理内容から学習する
  • しかし、大規模言語モデルの推論時はパラメータが固定。
  • どうやって処理内容から学習している?
  • 自己注意(self-attention)機構が実現、自己注意機構は式変形をすると、重みパラメータを一時的に変えているとみなせる
  • そして、大規模言語モデルに使われている自己注意機構は、パラメータを変えて学習した場合と同様に、指示や再生しているデータにあわせて、モデルを急速に適応させていくことが分かった
    • 具体的には、勾配降下法と同じ効果をシミュレーションして、次の単語を予測する
  • このメタ学習により、分布外汎化を達成できる

論文まとめ DEPLOT: One-shot visual language reasoning by plot-to-table translation

URL

https://arxiv.org/pdf/2212.10505.pdf

組織

概要

  • チャートやプロットのような視覚言語は、人間の世界ではいたるところに存在
    • チャートやプロットから情報を得る= 視覚言語推論(visual language reasoning)
  • 本論文では、視覚言語推論に対するone-shotでのsolutionを提示
  • 2つのステップに分解
    • (1) プロットからテキストへの変換→DEPLOT
    • (2) 翻訳されたテキストに対する推論→LLMs
  • 28k以上のデータでfine-tuningしたSOTAモデルと比較して、DEPLOT+LLMは24.0%の改善を達成

Intro

  • プロット/チャートの質問応答(QA)のような下流のタスクでは、モデルはまず画像から関連情報を抽出し、それらを整理・推論を実行する必要がある。
  • 既存研究では、エンドツーエンドモデルによる解決策が提示
    • (Leeら、2022;Liuら、2022a)
  • エンドツーエンドの手法は大量のタスクデータでfine-tuningする必要があり、fine-tuning後も複雑な推論を必要とするクエリでは遅れをとっている
      • 現在のSOTAモデルMATCHA (Liu et al., 2022a)は、ChartQA (Masry et al., 2022) タスクにおける人間が書いたクエリではわずか38.2%の精度
  • GPT-3やPaLMは凄いけれど、マルチモーダル推論タスクがLLMからどのように恩恵を受けるかは未解決の問題
  • 本研究では、マルチモーダル視覚言語推論問題を、下記で解くことを提案
    • (1)入力されたプロット画像をリニアライズされたテーブルに変換
    • (2)線形化テーブルをLLMに渡してone-shotを行う問題に分解する

DEPLOT + LLMメソッド

  • 貢献
    • (1) plot-to-table taskを標準化し、テーブル比較のための統一的で有益な指標を提案する。
    • (2) マルチモーダルタスクを言語のみのタスクに変換し、LLMを利用してワンショットで解くモデルDEPLOTを提案する。
    • (3) DEPLOT+LLMはChartQAにおいてone-shotでSOTAを達成し、人間が書いたクエリにおいて2番目に良い方法(fully supervised)を24.0%上回った。

Background

  • 視覚的言語推論(visual language reasoning)は自然画像推論(natural image reasoning)とは異なる課題を提起する。
    • 第一に、複雑な視覚的言語データ(本研究ではプロットとチャート)から正確で詳細な情報抽出(IE)を必要とする
    • 第二に、抽出された情報に基づいてクエリに答える非常に強力な数値推論スキルが必要である。

Trainingの手法

  • SOTAモデルMATCHA(Liu et al.、2022a)のアーキテクチャと重みを持つ、image-to-text encode-decoder Transformer modelを初期化します。
  • プロットをその基礎となるデータテーブルにマッピングするタスクで、MATCHAチェックポイントのfine-tuningを続ける。
  • 表は、セルを区切る|と行を区切る \n を持つテキストシーケンス(マークダウンフォーマット)として線形化される。
    • 例:

表の例

  • DEPLOTは、左から右へ自己回帰的に表を生成するように訓練されています。

学習用コーパス

  • (1) Liuら(2022a)が生成した合成データ
  • (2) Methaniら(2020)が生成した合成データ(PlotQAデータセットでも使用)、
  • (3) Masryら(2022)がクロールした実世界のデータ(ChartQAでも使用)。
  • (1), (2), (3)を1:1:1で混ぜたもの

Traninngの手法を、学習用コーパスに対して適用したものをDEPLOTと呼ぶ

メトリック

  • Relative Mapping Similarity
    • precisionとrecall

メトリック

  • N: predict tableの数, M: target tableの数
  • X: 最小コストマッチングX∈R N×M
    • コスト関数1 - NLτ (p r ||p c , tr ||t c ) を用いて、PとTの鍵間のペアワイズ類似度を計算したもの
  • Dθ(p,t): min(1,||p - t|| / ||t||)
    • 相対距離

LLMによるprompt

  • 最初にテーブルの情報を与えて、その後のQAをCoTで解かせている模様

プロンプトの例

Experiment

性能

  • 赤は人間が書いたquery、青は合成query
  • 人間が書いたqueryについては、DEPLOT + LLMsの方が強い
  • DEPLOT + LLMsが弱い部分に関しての考察
    • augは、テンプレート化されたqueryが多く、MATCHAのようにfine-tuneしたモデルは解ける
    • しかしDEPLOT + LLMはone-shotのみで学習しており、解くことができない

Limitation

  • DEPLOTの強みは、plot-to-table(画像をテーブルに変換するタスク)の精度に大きく依存
  • 効果的なplot-to-tableのためには、多様なデータが大量に必要。DEPLOTがどの程度out-of-domainのplot-to-tableが可能かは未知数。今後調査予定。
  • DEPLOTは、教科書の図版のように、明確な潜在的なテキスト表現を持たない視覚的言語に対しては機能しない
    • 図版は専用のソフトウェアで作成され、明確な構造化表現を持たない
  • 現在のDEPLOTアプローチは、視覚的要素やオブジェクトの向きや色などのレイアウト情報を無視している。将来的には、これらをデコード対象に含めることで、考慮したい。

コンサルティング会社 完全サバイバルマニュアル 感想

感想

コンサルタントストーリーとビジネス的に役立つ知識が交互に記載されていて、非常に読みやすかった。特にストーリー部分は起承転結があり、小説的な観点でも盛り上がる。知識の部分もハッとする内容が多く、何度も読み返したい内容だった。

個人として活躍するなら、第ニ部ジュニアコンサルタント編を読み、チームを持つなら第三部、シニアコンサルタント編を読むと良さそう。

現在は事業会社に勤めているが、真似したい部分が多々あったので備忘録を残す。

ジュニアコンサルタント編で真似すること

  • 担当する業界の本を3冊読む、題材を扱った小説でも良い
  • 担当する業界の政策や管轄省庁の動向や分科会の資料を読む
  • 現場で何が起きているのかの一次情報を自分で集めに行く
  • クライアントは最終的に誰にどのような報告をするのか理解する
  • 前提を疑う、今しようとしている仕事の意味に少しでも疑問を持ったのであれば、仕事の前提を上司やクライアントに相談し、チーム全体の作業の方向性を修正していく
  • 自分はどのような環境であれば活躍できるのか上司に定期的に説明する
    • 強みが社内で認識されないと、「頑張っているけど具体的に何ができる人なの?」となる
  • 自分が作成するアウトプットについて、上司やクライアントから反対意見があっても一度は根拠を持って説得を試みる、一度自分の出した意見に対して説明責任を持つ
    • 反論できるだけ考えを深めておく
  • プロなら仕事へのモチベーションを自分自身で作り、維持し、減ってしまった場合には回復させる。
  • コンサルタントがクライアントに売っているものは、与えられたタスクを終わらせることではなく、事業全体に対する「変化」。
  • クライアントを「変える」ために、今自分が働きかけるべき人や部署はどこにあるのかを把握し、関係性を積極的に開拓していく動きをしよう。
  • データの流れを考え、関係部署の調整を早めに行う
  • 相手側の作業待ちの際には、前提を置いて進める
  • 最初の1週間でクライアントに対して価値貢献をし、信頼を勝ち取ることに集中しよう。
  • 管理職であるマネージャーになることを見据えた期間は、チームが、プロジェクト全体が適切に機能しているのか、この仕事は本当にクライアントに対して望ましい変化を起こすものか、という視点を培う

シニアコンサルタント編で真似すること

  • マネージャーはプロジェクトを勝利に導ける、これが唯一にして絶対的な条件
  • マネージャーであるからには、どんな手段を用いても勝たなければいけない。社内に人がいないなら外部の業者を自分で連れてくる。ツールがなければ自分で探すか、作る。手段を択ばない、総力戦
  • 炎上するプロジェクトは、提案の内容が非常に抽象的であるという共通項がある。
  • 成果の数値化から逃げない
  • プロジェクトを成功に導く具体的なアプローチを定義する
  • いかに優秀な頭脳を社内で確保し、プロジェクトに引っ張り込むことができるのかはマネージャーとしての手腕の見せ所
  • 時間を捻出するため、優先度の低い会議を無視する
  • 部下と1対1で会話する時間を作る。当人の主張をまずは否定することなく受け入れる。と同時に部下の主張に流されてもいけない。スタッフのやりたいことが必ずしもクライアントの利益につながるない
  • 自他ともに強みはこれだ! という「キャラ」を立てると、自己評価と他者評価のギャップが埋まり楽になる。
  • 個性を発揮できる場所を自分でデザインする
  • 仕事を〝やらされている〟リーダーに付いていく部下はいない