flutterで内蔵辞書検索(iOS)
はじめに
flutterで内蔵辞書検索 on iOSを実装してみたので,その備忘録を書きます.
方法
以下の手順で行いました
iOS側で辞書検索のためのmethodを実装
flutter側からmethod channelで呼び出す
単純ッ
実装
iOS側の実装
iOSでは内蔵辞書検索のためのAPIとしてUIReferenceLibraryViewControllerが用意されています
こちらのapiは,単語を引数として受け取り,内蔵辞書に対する検索結果のViewControllerを返すという動作をします.辞書内に複数見つかった場合はリスト表示され,見つからなかった場合はNot Foundが表示されます.
あくまで辞書の検索結果のページを返すだけであり,検索結果をデータとして取得して弄るなどのことはできないようです(著作権のせい?).
ただ,MacOS用なのででiOSでは使えないのですが,swift自体にはDCSCopyTextDefinitionという検索結果をデータとして得られそうなAPIが用意されているみたいです.
とりあえず,今回はflutterからUIReferenceLibraryViewControllerを呼び出せるようにiOS側に実装します.method channelの実装は以下を参考にしました
FlutterでiOSのネイティブコードを呼び出す - Qiita
以下をmethod channelで呼び出します
func searchDictionary(result: FlutterResult, controller: FlutterViewController, queryWord: String){ let ref: UIReferenceLibraryViewController = UIReferenceLibraryViewController(term: queryWord) controller.present(ref, animated: true, completion: nil) } }
flutter側
iOS側に書いたmethodを呼び出すだけなので省略.
実際の動作
実際に使ってみると,レスポンスは遅いですが,辞書検索の結果が表示されることがわかります. iOSが検索窓などで提供してる辞書検索は一瞬で結果が出るのに,なぜアプリからだとこんなに遅いんだ
その他
内蔵辞書検索機能は,それだけを提供するような単純なアプリだとrejectになるとドキュメントや以下のブログにて言及されています
Apple Developer Documentation [iOS] 内蔵辞書機能を使うとリジェクトされる? | Cocoamix.jp
どの程度シンプルだとrejectになってしまうのかはわかりませんが,サブ機能程度にしておいた方が落ち込む危険性が低そうです
email & socialログインを実装する際のRDBのスキーマについて
はじめに
email & twitterなどのsocialアカウントでのログインの実装をしようと思ったのですが,各サービス用の認証情報のためのRDBのスキーマをどう設計するかで詰まりました. 現状のベストプラクティスなどを探してみたのですが,あまり情報が見つからなかったので,自分がやった方法を備忘録としてまとめます. 一旦,emailとtwitterでの認証を用意するという前提で設計しました.
結果
いきなりなのですが,以下が最終的に決定したスキーマになります
userテーブルが基本的なユーザ情報を格納するテーブルです.
認証情報は,サービスごとにuser_auth_serviceというuserのidを外部キーとして持つテーブルを作り,そこに入れるという感じです.
userがどの方法で認証を行うかはuserテーブルの中に保存しておきます.
メリットとしては以下があるのではと考えています
- 新たな認証方法を追加しやすい
- 新たな認証用のテーブルを追加するだけでよく,既存のテーブルに変更を加える必要がない(と思う)
- ユーザの退会がしやすい
- ユーザの退会の際にユーザ情報を消そうとすると外部キー制約に引っかかりますが,この方法ならその影響を受けずに認証に関わる部分を一発で消せます
一方で以下のデメリットがあるような気がします
- 複数の認証情報を持つようなケースに対応しづらい
- emailと電話番号両方というようなケースに対応する場合はuser_auth_multiとかのテーブルを作るかauth_methodを増やすとかになるんでしょうか...
- userと認証情報をjoinして列挙したりしづらい
- デッドロックしないように配慮が必要そう MySQL 外部キー制約のデッドロック | 優技録
検討したけど無理そうだった方法
サービスごとの認証情報を同じテーブルで持つ方法
php - Database structure for social login implementation? - Stack Overflow
認証情報を同じテーブルで持ち,providerというカラムでどのプロバイダ用のものかを判定する方法です
以下のような方法で微妙そうだなとなりました
- EAVはアンチパターン
- providerごとにキーの性質が違うときつい
- providerごとのキーがバッティングしない可能性がゼロではない
- ユーザがどの方法で認証するかを判定するためにレコードを走査する必要がある
userテーブルにサービスごとのカラムを付け足す方法
空白箇所が増えるなど無駄が多そうなのでやめました
サービスごとにユーザのテーブルを作る方法
外部キー制約をかけるのが辛かったりユーザの列挙が辛かったりその他様々な理由でダメそうでした
最後に
今は良さそうと思っていても,実装するうちに致命的な欠点などが見つかりそうで怖いです
また,サービスのアーキテクチャはよく公開されているのを見かけるのですが,長く運用されているDBのスキーマの変遷の歴史や,ベストプラクティスはあまり見ないので,とても気になるなぁ〜と思いました
「白い春」を見た
阿部寛さん主演,尾崎将也さん脚本の「白い春」を見たので感想を書きます.
概要
2009年に放送された阿部寛さん主演のドラマです.脚本は「結婚できない男」でも知られる尾崎将也さんです.彼女の病気を治す金を得るために止むなく殺人を犯した元ヤクザの男が,刑期を終え出所します.しかし,元気にいきているはずであった彼女は亡くなっていることがわかりました.納得がいかない主人公が公園でうなだれていると,絵を描く女の子に話しかけられ...というのが始まりです.家族愛を描いた感動ドラマでした.
なぜ見たか
2chのtrickスレとかを見ていた際に阿部寛主演のおすすめドラマとして挙げられていたからだったと思います.丁度amazon primeにも入っていました.普段はほとんどドラマなどは見ないのですが,ふと1話目を見たら,すごく引き込まれてしまい.そのまま2,3日で全部を見終えてしまいました.その辺の映画のようなあまりに壮大な家族愛でなく,身近で,血と汗の通った,輝かしいだけでない家族の愛が描かれていたような気がします.
最初の印象
阿部寛さん主演のドラマというと「trick」や「結婚できない男」などコメディ色の強いものが多いイメージだったので,コメディ色強めの家族ドラマなのかなと思っていました.しかし,登場した阿部寛演じる主人公の顔があまりにドス黒く,見た瞬間にこれはマジなやつだなと感じました.遠藤憲一演じるパン屋も,幸せ満点という感じでなく,キツイ仕事を続ける中で得られるお客さんの幸せや家族の生活に,(ヤクザの主人公に比べ)小市民ながらプライドを持っているという感じがすごくリアルでした.
内容の感想
人生で見たドラマや映画の中でも,1,2を争うくらい面白かったです.2話の最後にパンをかじるシーンや,最終回の主人公が女の子に父親のすごさを語るシーンでは,ボロボロ泣きました.単なる家族愛ドラマでなく,色々なものを失い,帰る場所もない主人公の寂しさ,子供を守る父親の強さとその裏の不安など,泥臭い感情を注ぎ込んでくるような作品でした.見ていると両親の仕事で疲れた姿や,町の店の店員さんのささやかな笑顔とか,そういった日常の裏側を思わされ,そこでも涙が出ました.あり触れた日常がどれだけの努力の上になりたっているのかを考えさせられます.何回も見直し,シーン一つ一つを噛み締めたくなる作品でした.
色んなソース上で大きいサイズのテストデータを作る
はじめに
性能試験を行いたいとき,100GBを超えるようなデータをS3のようなストレージだったり,MysqlのようなRDBなどの上に用意したいことがあると思います.しかし,単純にやろうとすると以下のような問題に直面します.
- ローカルで100GBのデータなんか作れない!!
- 作れても転送に時間かかりすぎ!!
- 101, 102GBみたいに刻んで作る必要があったりすると,もう無理!!
ということで今回はGCS,MySQL,Bigquery上に色んな大きいサイズのデータを作成することを行なったので,備忘録として書いてみようと思います.
方法
基本的に小さいデータを作って転送してから,それをコピーしまくる方針で行う
GCS
主に以下の手順で行います.
- 1GBぐらいのサイズのデータをローカルで作る
- gsutilを使ってGCS上にアップロードする.
- gsutilコマンドを使って,必要なデ. ータサイズ分コピーを繰り返す.
aws S3などの場合でも,awsコマンドで同じようなことができると思われる.
MySql
- 1GBぐらいのサイズのCSVデータ(test_1GB.csv)をローカルで作る
- MySql上にtest_1GBという名前で,先ほどのCSVを入れるためのテーブルを作る
- mysqlimportを使って,先ほど作ったCSVをテーブルに入れる(mysqlimportコマンドで転送する対象のテーブル名はcsvのファイル名と同じでなくてはならないよう?)
- 以下のようなクエリを必要なデータサイズ分叩く
DROP TABLE IF EXISTS testdata_NGB; CREATE TABLE testdata_NGB; # 以下を繰り返し INSERT INTO testdata_NGB SELECT * FROM test_1GB;
Bigquery
- 1GBぐらいのサイズのCSVデータ(test_1GB.csv)をローカルで作る
- 作ったCSVを入れるようのbigquery schemaをjsonで定義する
- bq loadコマンドでCSVをもとにテーブルを作成する(スキーマのauto detectも可能)
bq --location=$LOCATION load \ --replace \ --source_format=CSV \ --skip_leading_rows=1 \ $PROJECT_ID:$DATASET."test_1GB" \ ../test_1GB.csv \ ./schema.json
- bq cpコマンドを必要なデータサイズ分繰り返す
bq --location=$LOCATION cp \ --append_table \ $PROJECT_ID:$DATASET."test_1GB" \ $PROJECT_ID:$DATASET."test_${DATA_SIZE}GB"
重松清さんの「流星ワゴン」を読んだ
重松清さんの「流星ワゴン」を読んだので感想を書きます.
概要
ドラマ化もされた重松清さんの代表作だと思われます.家庭や仕事,全てが崩れかけになり自殺を考えていた主人公の前に過去へと向かうワゴンが現れるという内容です.ビタミンFに代表される,家族の現実,温かみなどを感じさせてくれる小説でした.いつもは心をどん底に落としてくるようなものを読んでいますが,たまにはこういうものもいいです.3週間ぐらいかけてちびちびと読みました.
なぜ読んだか
いつも読む小説の多くは突出した悲劇が書かれていました.そういうものは自分の心をどん底に突き落としてくれますが,やはり自分の生活とはかけ離れているので,日々の行動にポジティブな影響を与えるかというとなんとも言えません.最近,生きるうえで起こる悩みをどう捉えるか,どう捉えていくかについて考えていて,その中で,自分が社会を生きていく中で遭遇するような悩みをちゃんと受け止められるかというのが気になりました.流星ワゴンで書かれているのはまさに血の通った悩みの数々であり,そういうものを体験してみたかったのが大きな理由かもしれません.あと,流星の絆を読んでみようと思って探してたらこれを見つけたというのもあります.
最初の印象
私はファンタジーとかがあまり好きなタイプの人間ではないので,タイムスリップと書かれているあらすじを読んで,うーん,これはちゃんと生々しい部分を感じれるようなもんなのかなぁ〜,魔法でごまかしたりしないかなぁと思っていました.よくわからない超常現象に人間の心がグラグラ動かされるというのは,感情移入がしにくいです.この小説はそことは反対だったので,とてもよかったです.
内容の感想
人間関係における不器用で伝わりきらない部分,でもそこを生きてるからこそ感じられる希望みたいなのを自分も体験できたような気がします.人間どうしようもない部分がたくさんあって,それで人とすれ違ったりもするけど,ちゃんと繋がってる部分はあるよと教えてくれるようでした.タイムスリップというファンタジーな要素も,周りの人間の不器用さの裏側の思いを知るための舞台装置としてうってつけなように思えました.本人にしかわからない葛藤を考えず,表面に出てくる結果だけを見てしまうよくないコミュニケーションが発生することは多々ありそうです.そこを広く受け止められる心を持って,また,他人の裏の温かみを見落とさないように生きていこうと思います.ドラマは最後ファンタジーパワーで全部解決するらしいですが,やっぱどうにもならない日常に希望を見出して生きてくというほうが,私は好きです.
Multi-Modal Learningのサーベイ論文を読んだ
マルチモーダル学習についてのサーベイ論文を読んだので,見返しようにまとめてみたいと思います.
論文情報
Multimodal Machine Learning: A Survey and Taxonomy
Introduction
マルチモーダル学習の分野はそのタスクに寄って大まかに5つのカテゴリに分けられる.
Representation
マルチモーダルなデータをどう表現したり要約したりするかについて.テキスト情報や信号データなどを同一空間で扱えるかなど.
Translation
あるモダリティのデータを別のモダリティのデータに変換するタスク.画像からその説明文を生成するなど.正解が1つに絞られない,
Alignment
複数のモダリティ間の直接的な関係を明らかにするタスク.
料理を作るビデオを例とすると,その各シーンを正確に並び替えるには料理のレシピの情報と画像中の情報を結びつける必要がある.
Fusion
ある予測をするために複数のモダリティの情報を利用するもの.例として,スピーチの内容を正確に判定するために,音声に加えて動画中の話者の口の動きを使うなど.
Co-learning
あるモダリティ内で作られた予測モデル,ベクトル表現などを別のモダリティに転移させるようなもの.Zero-shot learningやco-training,conceptual groundingなどが例としてあげられる.あるモダリティ上で得られた知識が別のモダリティでどう活かされるかに興味が置かれる.
応用先
- 唇の動きと音声を利用したスピーチ認識(Audio Visual Speech Recognition:AVSR).信号がノイジーな場合などに有効.
- マルチメディアのインデクシングと検索.画像や音声をキーワードベースでなく直接画像などで検索する.
- マルチモーダルデータを用いて人間の振る舞いを理解する.ビデオや発言からの感情認識など.
- 言語と画像を対象としたもの.画像のキャプショニングなど.画像キャプショニングでは評価方法が一番の課題らしい.
Representation
Representationは大まかにJointとCoordinateの2つの種類に分けられる.
Joint Representation
射影としてはDNNやボルツマンマシンなどが使われる.各モダリティの特徴表現(BoW,メル周波数ケプストラム係数など)への依存がある.
- 一番シンプルな方法は,書くモダリティの特徴量をconcatinateするというもの.
- 近年はニューラルネットやオートエンコーダを使うものが多い.事前学習が可能な点が有用だが,データが大量に必要だったり欠損データへの対応が難しい.
- その問題に対応するためにDeep Boltz Machineが利用されたりする.DBMのような生成可能なモデルを使うことで一部モダリティの欠損に対応することができる.
- シーケンス長が一定でないデータに対してはRNNなどの時系列モデルが用いられる.
Coordinate
各モダリティに,共有空間へ射影するための関数を用意するタイプ.関数はモダリティ間で異なるが,射影後の空間は共有される.
- Smilality models:モダリティ間の特徴ベクトルの距離を最小化するようなモデルを設計する.Web Scale Annotation by Image Embedding: WASABIEなどが有名なタスク.従来はモダリティ間の関係を表すラベルを元に射影行列を設計することなどがされていたが近年ではNNが用いられる.DeViSEなどはEnd-to-EndでWASABIEを行う.
- Structured coordinate space: 距離以外の制約を加えてモデルを設計する.Cross-modal Hashingなどがある.
Translation
Translationは大まかにexample-basedとgenerativeの2つに分けられる.
Example-based
基本的に辞書データをベースにtranslationを行う.
Retrieval based modal
辞書データから最も近いデータを持ってくるというもの.モダリティの中で近いデータの検索を行うものと,共有空間内で近傍データを検索するものに別れる.テキストをスピーチに変換するタスクや画像のキャプション付などに用いられた.semantic空間を用いた検索は双方向の翻訳が容易などの利点があるが,その空間の設計のために辞書データ(学習データ)が大量に必要となるなどの問題がある.
Combination-based Model
検索ベースだが,その検索のクエリとして複数のモダリティのデータを結合したものを用いる.多くがhand-crafted特徴を用いている.
Generative-approaches
与えられたデータをもとに別モダリティのデータを生成するアプローチ.
ソースとターゲット両方のモダリティの性質を理解する必要があり難しい.
Grammar-based Model
事前にある程度Translationの規則(Grammar)を決めておくもの.
画像やビデオより物体や動作などの高レベルの概念を取得し,それをもとにTranslationを行うような感じ.
Encoder-decoder Model
ニューラルネットを用いたE2Eな手法.一度データを何らかのベクトルに落としてから別モダリティのデータへデコードする.機械翻訳のためのモデルがそのまま画像のキャプショニングに用いられたりしている.
Continuous generation Model
テキストから信号への変換のように,連続的なデータをオンラインに,タイムスタンプごとに変換していくタスク.graphicalモデル,continuous encoder-decoderモデルなどが用いられる.
Model evaluation and discussion
Translationの評価は難しい.現状人を集めて評価を行ってもらったり,別モダリティのデータのペアを互いにtranslateしあう,検索システムを使うなどの方法が取られている.
Alighment
異なるモダリティのデータの一部が与えられたとして,それらのなかで関連する部分を探すようなタスクと本論文では定義している.例えば画像とそれに対するキャプションが与えられ,画像中のキャプションに関連する箇所を特定するなど.
大まかにimplicitとexplicitに分割する.
Explicit alignment
あるインスタンスについてそのサブコンポーネントが2つ以上ある場合のalighnmentをここにカテゴライズする.
Explicit alighnmentにおいては類似度のはかり方が重要となる.学習ベースで類似度指標を設計する手法はUnsupervisedとsupervisedに分けられる.
Unsupervisedの多くは統計的機械翻訳の手法やgenome sequenceなどの手法からインスパイアされたもである.代表としてはDynamic time warping (DTW)などがある.
Supervisedの手法としては,CCAや混合ガウスモデルを用いるものなどが提案されてきたが,近年ではDeepLearning手法が台頭している.
Implicit alignment
explicitと違い,implicit alighnmentは他のタスクで利用するための潜在表現として利用される.これはVQAや機械翻訳などの厳密なalighnmentがないタスクに対する手法のパフォーマンスの向上に利用できる.手法は大まかにGraphical modelとNeural Networkに分けられる.
Graphical modelは機械翻訳やspeech phenemesのalignmentに利用されてきた.しかしそれらは人手での単語間のマッピングなどを必要とする.
Neural Networkは近年よく用いられており,encoder-decoderモデルはそれら従来の機械翻訳の問題に対応できる.しかし,implicit alignmentを利用しない場合,encoderへの要求が大きくなってしまう(うまく文書全体,画像全体を潜在表現に落とし込むことが求められる).この問題に解決する手法としてはattentionが有名である.
Discussion
Multimodal Aligmentの難しさとしては,1.厳密にaligmentがアノテーションされたデータセットが少ない,2.モダリティ間の類似度指標を定義するのが難しい,3.モダリティ間のデータに一対一の関係が成り立たない,などがある.
Fusion
fusionは,複数モダリティのデータを用いて予測を行うような分野である.マルチモーダル学習の中で最も歴史が長いものの一つ.
メリットとしては,複数モダリティのデータを用いることでよりロバストな予測を行うことができる,どこかのモダリティのデータが欠けていても予測ができる,などがある.
応用分野はAudio Visual Speech Recognition (AVSR),感情認識,医用画像解析,マルチメディアイベント検知など幅広い.
ここではFusionをmodel-agnostic,model-basedに分類する.
Model-agnostic approaches
model-agnosticは機械学習の手法と直接関係しないようなアプローチである(特徴量の組み合わせ方など).
歴史的にはこちらの方がより多く取り組まれてきた.大まかにearly, late, hybridに分けられる.
earlyは各モダリティの特徴量をそのままconcatしたりするというものが多い.各モダリティのlow levelでの関係を学習できる,基本的にモデルが一つしか必要ないなどの利点がある.
lateでは各モダリティの特徴を元にそれの平均をとる,結果のvotingを行う,分散やchannel noiseを元に重み付けをする,モデルを学習するなどの手法がとられた.これらの手法には各モダリティで別のモデルを利用し異なるアウトプットを得ることで,それらを柔軟に組み合わせられるという利点がある.また,どれかのモダリティのデータが欠けていても訓練や予測ができる.しかし,モダリティ間のlow levelでの関係を捉えられているとは言えない.
hybridではその両方を組み合わせており,話者特定やmultimediaイベント検出で成果をあげている.
Model-based approaches
単一モダリティに対して利用される機械学習手法を複数モダリティ用に拡張する.
Multiple kernel learning (MKL) はカーネルSVMを拡張したものである.モダリティごとに別々のカーネルを利用する.MKLベースの手法は様々な応用ができ,また,損失関数がconvexなのでスタンダードな最適化パッケージを利用できる.分類,回帰の両方に対応できるという利点もある.デメリットとしてはトレーニングデータへの依存の高さ,テスト時の推論の遅さ,メモリの使用料などがあげられる.
Graphical Modelsによる手法は大まかに,同時確率をモデリングするgenerativeと条件付き確率をモデリングするdiscriminativeに分けられる.初期ではcoupled and hidden Markov modelとdynamic Bayesian networkを組み合わせるgenerativeモデルが提案された.
Graphical Modelの利点として,データの局所的,一時的な構造を捉えるのが容易であるという部分がある.また,専門家の知見をモデルに組み込み,解釈可能なモデルを設計することができる.
ニューラルネットは近年よく利用される.主な応用例としては,image captioning,audio-visual emotion classificationにCNN,RNNを用いるケースがあげられる.ニューラルネットの優位な点として,大規模なデータを有効に利用できるという点,RNN系列の手法がマルチモーダルでの表現学習とfusionの両方に利用できるという点がある.また,他に劣る点としては,結果の解釈性が低く,多くのデータセットが必要になるということがある.
全体として,現状,ニューラルネット系列の手法が多く利用されるが,以前graphical modelとmultiple kernelも利用される.現状の課題点として,1) 信号が稠密なのに対して,重要なイベントがスパースである,2) データの全体でなく,一部を利用するようなモデルを設計するのが難しい,3) モダリティごとに違うタイプのノイズが違うタイミングで現れてくる,などがある.
Co-learning
co-learningはあるモダリティにおいてモデルを設計する際,(データが豊富にあるような)別のモダリティのデータを利用するというものである.co-learningにおいては,訓練時のみに別モダリティのデータを利用し,テストの際には利用しない.co-learningはそれが訓練時に利用するデータのリソースに応じて,parallel,non-parallel,hybridに分けられる.
Parallel data
parallel dataは,あるモダリティのデータと別モダリティのデータが完全にリンクしているようなケースである.例として,映像とその音声の組み合わせがあげられる.このケースにおいては,それぞれのモダリティにおいてモデルの性能の向上が期待できる.
Co-trainingはマルチモーダルなタスクに置いて少量しか訓練データが存在しない際に,ラベル付きのデータを生成するような処理である.例として,ラベルなしデータに対応するラベルありデータを別モダリティから取り出すために,弱学習機を各モダリティのために設置するなどが行われる.
このようにCo-trainingは学習データの増加に利用できるが,モデルのオーバーフィットなどが課題になる.
また,転移学習もparallelデータに大してco-learningを行う方法の一つである.
multi-modal Boltzmann machineやmulti-modal auto-encoderはあるモダリティの情報を別モダリティに転移させるのに利用される.これはマルチモーダルな表現の学習だけでなく,単一モダリティの表現力の向上も行うことができる.具体例として,スピーチ情報をリップリーディングに組み合わせ訓練を行いつつ,テストを行う際にはスピーチ情報を必要とせずリップリーディングの性能を向上させた研究が行われている.
Non-Parallel data
non-parallel dataは,モダリティ間でインスタンスが共有されていないが,カテゴリやコンセプトは共有されているようなケースである.このケースで利用される手法は,表現学習の際によりセマンティックな情報を取り込ませたり,未知オブジェクトへの対応などに利用できる.
転移学習はデータがnon-parallelな状況に対しても適用できる.転移学習によって,よりデータが多く綺麗なモダリティから良い表現を得るといったことが可能になる.代表として,タグの学習済みエンベディングを画像分類モデルの訓練に組み合わせるというものがある.このように訓練されたモデルは,たとえ分類が間違っていたとしても,元のカテゴリに近いクラスと判定したりと,エラーに関しても多くの情報量を含んでいる.
Conceptual groundingは言語上の意味情報だけでなく,視覚や音声など他のモダリティの追加情報を意味づけに利用するようなケースである.人間の知識は様々な知覚情報に大きく依存しているため,言語情報のみで意味づけを行うのは最適とは言えない.
初期の研究としては,各モダリティ間で共通の潜在表現を獲得するもの(Parallelなデータに対して),各モダリティそれぞれで表現学習を行なったのちそれを組み合わせる(Non-Parallelなデータに対して) などが行われていた.一度マルチモーダルな表現が得られれば,それはピュアなNLPタスクに利用できる.使用の一例として,それらの表現をメタファーやリテラル言語の分類に利用する研究が行われている.これらの表現はデータが意味的にどの程度似ているかを測る際などに有用である.
Conceptual groundingによって様々なタスクのパフォーマンス向上が期待できるが,groundingがタスクに関係ないようなケースでは,逆にモデルの性能を劣化させてしまうこともある(見た目が似ているような概念を結びつけるタスクなど).
Zero-shot Learning (ZSL)は見たことのないコンセプトを持つデータをモデルに知覚させるようなタスクである.例えば,猫という概念を猫とラベルがついたデータなしにモデルに認識させることを目標とする.これは画像認識など,ラベルを与えなければならないデータが際限なく存在するようなタスクで重要となる.
ZSLには大まかにunimodalとmultimodalの二つのタイプがある.unimodal ZSLでは,対象のパーツや特性を元に認識を行う.例として,音素を元に聞いたことのない単語認識したり,画像中の物体のパーツの一部から判定するといったものが存在する.multimodal ZSLでは,他のモダリティの情報を利用して本来のモダリティの認識を行う.multimodal ZSLは,Non-Parallelなデータに適用する際,適用するモダリティごとにオーバーラップしているクラスが多くの場合で異なってしまうという問題がある.
ZSLの例として,画像特徴を単語の意味空間に埋め込む研究が行われた.これによって,unseenなオブジェクトは視覚的に類似している単語に割り当てが行われる.他にも画像とコンセプトが協調しているような空間を設計する研究,いくつかの画像から人の想像している単語を予測する研究などが行われてきた.
Hybrid Data
Hybridのケースは,non-Parallelな2つのモダリティを,共有されている1つのモダリティによって橋渡しするようなものである.有名な手法として,Bridge Correlational Neural Networkというものがある.適用先として例えば多言語での画像キャプショニングがあり,その場合は画像が複数言語の間で共有される情報となる.この手法は別言語への翻訳を行う際,常に対応するコーパスが存在しないような場合に利用される.
Co-Learningはfusion,translation,alignmentなど様々なタスクに適用でき,実際,画像認識,動作認識,ASVRなど様々な箇所に応用されている.
長くてめちゃめちゃ雑になってしまいました...
ProjE: Embedding Projection for Knowledge Graph Completionを実装,実験してみた
はじめに
ナレッジグラフ(KG)の埋め込み手法であるProjEを実装,実験してみました. 他の手法に比べると引用数が少ないですが,結構シンプルで精度も出て,リンクの予測ができたりベクトルの事前学習も必要ないなどいろいろな利点が存在するようです. 論文は以下になります.バージョンが2つあり,訓練のアルゴリズムは古い方のものにだけ書いてあります.
[1611.05425] ProjE: Embedding Projection for Knowledge Graph Completion
ナレッジグラフの埋め込みでは,Tramp is Presidentのような主語,述語, 目的語のセット(RDFトリプル) に対して
を満たす空間を設計することを目的としています. 有名な手法としてはTransEなどがあります.
Translating Embeddings for Modeling Multi-relational Data
本論文ではそれらの従来手法よりパラメータ数を減らしつつ,高精度なエンティティ,リンク予測を 行える埋め込み空間を設計する手法を提案しています. ただ,エンティティ予測の際,TransEなどが埋め込みベクトルの類似度のみでそれを行なっている のに対して,本手法では予測のための重みを掛けてから類似度をはかるということをしています. なので単純なエンベディングとはちょっと違うかもしれません.
手法の概要
まず,エンティティベクトルとリレーションベクトルを足し合わせる演算として次を定義します.
ここでとは,ベクトルの次元を縦横のサイズとして持つ対角行列です. つまりベクトルの各要素を定数倍するだけのものになります.ここで普通のdenseな行列でええやろとしていたら,精度があまり出ませんでした.
次に,この関係を満たすエンティティを探すため, 候補エンティティのベクトルを列として持つ行列に対して次の演算を行います.
式中のf, gはsigmoid,tanhなどの活性化関数です.ここでは,で得られたベクトルと, 全ての候補エンティティとの類似度計算をしています.の番目の要素は 候補との類似度ということになります.
最後に損失関数の部分になります. 損失としては関係を満たすエンティティと満たさないエンティティを分類するpointwise lossと, 候補エンティティが正解となる確率について負の対数尤度を最小化するlistwise,listwiseに重みを追加したwlistwiseが提案されています. point wiseの式は以下になります.
ほぼBinary Cross Entropyです.第一項は正例を評価していて,第二項は負例を評価しています. 負例は,e+rを満たさないエンティティから二項分布でサンプリングしてきます.
そしてwlistwiseは以下になります.
softmaxで出力を確信度の形式にしてから,負の対数尤度を取ります. wlistwiseでは対数尤度の足し合わせの際,(e,r)の関係を満たすエンティティの総数の逆数を 重みとして掛け合わせます.通常のlistwiseの際は重みを利用しません.
実装・実験
実装はPytorchで行い,実験はQuadro P6000を用いました. 全然整理できていないのですが,コードは以下になります.
GitHub - sheepover96/ProjE.torch: pytorch implementation of ProjE: Embedding Projection for KGC
また,tensorflowによる公式実装は以下になります.
GitHub - bxshi/ProjE: Embedding Projection for Knowledge Graph Completion
公式実装は学習結果の表示が綺麗です.あと公式なので多分正確です. 私の実装の方は公式に比べ学習が数倍早いのですが,メモリをめちゃくちゃ食います. これはネガティブサンプリングのための候補をキャッシュしているかどうかの違いだと思います.
データセットはFB15KとWN18RRを利用しました.
Relation Prediction | NLP-progress
評価は,論文中で利用されているMean RankとHIT@10を用いました. Mean Rankは,目標のエンティティが現れるまでのランクの平均で, HIT@10は,目標のエンティティが10位以内にあらわれる割合です.
結果は次のようになりました.オレオレの方はtailの予測を行なった結果ですが, 公式の方はtail, head予測どちらをやってるのかわかりませんでした.また, 実験結果はwlistwiseのものだけを示しています.
実装 | MeanRank | HITS@10 |
---|---|---|
論文 | 124 | 54.7 |
公式(tail) | 182.9 | 49.4 |
公式(head) | 275 | 41.5 |
オレオレ(tail) | 153 | 57.8 |
オレオレ(head) | 252 | 49.9 |
公式実装の方は,以前動かした時は論文ぐらいの精度だったのですが,なぜか今回は調子が悪いです. オレオレ実装は,部分的に論文に勝ったり負けたりしていますが,それっぽい結果は出ているんじゃないかと思います.