修行の場

知人が言っていました。これは修行だと。

ファッション分野のアプリ

ファッション分野のこと

消費者側としては、自分の服装、髪型、メイクの仕方を変えたりして、 自分を満足させたり、あるコミュニティでのキャラづくりをしたり、異性に気に入られたり、人によって、多様な目的があると思います。

販売者側としては、売れるデザインの商品を出したいなどといったことがあるのではないでしょうか。

ファッション分野では、組み合わせの試行錯誤が必要なコーディネート提案まで出てきている。 ユーザの能動的な検索を支援したり、チャットボットなどで相談に乗るようなサービスもできている。 また、アパレル企業などがブランド計画を立てるためか、流行予測があったり、 パルコなどの小売店が差別化のためなのか、個人に最適化したサービスを提供しているようです。

アプリ

化粧を支援するアプリ

YouCamMakeup

YouCamは使ってみると面白いです。 撮影した写真に対してメイクできます。 ほかにも、meituのmakeup plusやlooksなどがあります。 looksとYouCamMakeupは化粧品の購入もできるようです。

AIスマートファインダー

キャラチェン下地カラー診断で採用されているとのことです。ただ、このWebサービスは色診断のみで、 YouCamについているようなAR機能はついていないようです。

https://www.aiap.jp/case-study.html

服のラインアップ充実化を支援するアプリ

XZ

  • クローゼットにある服を元にコーディネートを提案してくれる。ユーザは服選びを考える時間が減る。もしくは、新しい組み合わせを発見できる。
  • 服はユーザが写真を撮影したり、アプリからの問いかけに答えることで登録できる。

Sensy Closet

  • 質問とAIとのやりとりによるユーザ理解
  • ユーザの嗜好に応じたコーディネートを数あるコーディネートから試行錯誤して提案

Pashaly

  • アップロードした画像を解析してアイテムごとに分解
  • 類似アイテムを検索

Wheretoget

  • 画像をアップロードして、他のユーザにアイテムの入手先を訊く機能がある。

髪型提案

東京大学で制作されたそうです。詳細は不明。

参考サイト

関連する技術

情報検索

見た目による検索はできているようです。Google Lensでは、写真をアップロードすると似たような商品をショッピングサイト横断的に検索してくれます。たぶん、Pashalyでも同じような機能はありそうです。ただ、手触りがどういったものかがわかるレベルなのかは不明です。ある程度は反映されていますが、完璧ではなさそうです。また、zozoでは属性による検索も検討されているようです。 画像入力による検索は結構枯れている感があります。 今後はチャットボットやSiriなどとのインタラクティブな検索が増えていきそうです。

レコメンデーション

東京大学の研究でAIによる化粧が人の化粧を上回っていたり、 meituのアプリで自動的に可愛く補正したりしてくれたりする機能はある。 現実の化粧品で可能な範囲で化粧を提案できれば完璧だと思います。

魅力工学

sijieらのチームが顔の魅力度をよりロバストに数値化するネットワークを提案した。 画像を入力として、魅力を出力できれば損失関数として利用することも可能で、おそらく自動化粧AIは評価ネットワークを使って強化学習のどれかの手法か勾配法を使ったのではないか。 詳細は不明

データセット

顔と魅力度評価がセットのデータセットがあります。

旅行を助けるアプリのまとめ

所感

ホテルやフライトの予約を支援するアプリはかなり多い印象です。 旅行に関する様々な予約をしてくれるチャットボットから、 価格予測機能付きの予約ツール。 予約サイト横断の価格比較ツールなど、 お得で自分にあったものを探すサービスが充実してきている印象です。

アプリ

Utrip

行き先の好きな属性の度合いを選択すると、 行き先の候補を出してくれる。 ただ、旅行先の全体集合が小さく、 検索インターフェースを活かしきれていない。

Deaps

  • ユーザのライブラリの写真やユーザが自ら入力した好みのカテゴリやタグを元に観光スポットをおすすめしてくれる。

Google Trips

  • 都市をインプットとして、おすすめの散策コースを何らかの基準によって2,3個提案してくれる。
  • GmailやInboxのbuy confirmationなどのメールを分析して自動的に旅行に関する情報をまとめてくれる。

Hopper

  • フライトやホテルの価格を予測して、ベストな購入タイミングを教えてくれる。

参考サイト

旅行アプリで使われているML技術

レコメンデーション

ユーザのWebサイト内の行動履歴を元に数ある選択肢の中から少数を提案 * ユーザの検索履歴や予約の履歴を利用 * ユーザにあったレンタカー、ホテル、フライトを提案 * 他の目的地、他の日付のサジェスト

予測

  • 飛行機の価格、ホテルの価格・空き状況の変化を予測して、提案してくれる。
  • 購入のタイミングを教えてくれる。

Sentiment Analysis

  • ユーザ側としては行き先の評価を収集できる
  • 客側としては自分の評価を収集できる

参考サイト

hyper sklearnについて調査した

ライブラリの機能

sklearnのモデル選択、ハイパーパラメータチューニングにhyperoptを使うためのライブラリです。 いちおうぺーぱーらしきものは出ています。

my take

このライブラリのコントリビューションは、 scikit-learn用のパラメータ探索空間を定義したことです。 パラメータ探索空間はconfiguration spaceの部分空間です。

活用方法としては、 そのまま使いつつhyperopt sklearnの探索空間を参考にして、 自前の探索空間を定義してそちらでもhyperoptで探索する。 結果的に良かったものを使う。という流れになると思います。

もしくはデータさえ増えればディープネットが使える見込みがある問題で モデル自体の解釈をしなくていい場合ならば 将来的にディープネットに置き換えられるので 性能差は少ないのでグリッドサーチとか簡単なものを使えばいい気もします。 どれ使っても変わらないでしょうね。

しかも、20 newsgroupsでも最適解にたどり着くのに、 2400evalかかっています。 ざっくりした性能のものをすぐに作りたいと行った場合は、

まとめると、

  • 問題によっては1日回す覚悟で
    • 少ないエポックで試して並列で長いエポックで試したものも作り置き換えるとか
  • SVMとか古典的なモデルで十分な性能が達成できそうで作り込んでいくのなら使ってもいいかも
  • ディープネット使うのならぶん回して、並列でグリッドサーチ。適当に良かったのを使い、最終的にDNNで置き換えるとか

使いどころが難しそうなライブラリですね。

Hyperoptを使ってみた

使い方

中身がわからない関数の最適化をするためのライブラリです。 使い方は簡単で、最適化対象の関数、探索空間、最適点の探索アルゴリズムを指定するだけで使えます。

サポートされている探索アルゴリズムは、ランダムサーチとTPEというアルゴリズムで、 beyesian optimizationは現時点では実装されていないようです。

実装

ドキュメントのサンプルコードを参考にすれば良いです。 sklearnの学習用のコードも書きました。 下記で説明しますが、パラメータの組み合わせによってはハングしたりクラッシュしたりします。 他のカーネルやパラメータの組み合わせでも正しく動く保証はなく、 何らかの対策が必要になりそうですが、ありえない範囲を指定しないといった暫定対策で対応刷ると良いと思います。

Hyperoptがハングする問題

irisデータセットsvm+poly kernelを探索範囲に入れたらhangしました。 多項式カーネルに関して似たような問題は報告されており、 おそらく、どこかで値が無限になってしまったり無効値になってしまったりしているのだと想像しています。 他にもcross_val_score関数がハング刷る問題もレポートされています。 どうも、ドキュメントによると、forkのあとにexecしない場合、生成したプロセスのスレッドプールが壊れて、 タイムアウトによりhangするようです。 この2つの問題を解決して初めて並列実行できます。

AutoSklearnを使ってみた

背景

AutoSklearnを使ってみました。 ただ、実行してみた結果、GridSearch, Hyperoptよりも得られた分類器の性能が低かったです。 autosklearnのバージョンは0.5.0です。 ちなみに、AmazonDeep learning AMIで構築したUbutu1804のEC2インスタンスではエラーが出ます。 クリーニンストールされた、Ubuntu 18.04では動きました。 どうも動かしてみた感じだと、指定したmetricが直接使われているわけではなく、 別の目的関数で探索が行われてそうな感じです。

APIドキュメントとサンプルを元に通り使っただけですが、 私の環境とデータセットではout of boxで使えませんでした。 現状はautosklearnのソースコードを読む必要がありそうです。

ライブラリが提供する機能の概要

シンプルで、

  • classifierとregressorおよびハイパーパラメータの選択
  • データ処理手法の選択
  • 特徴量処理手法の選択

です。scikit-learnベースなのと、 ディープネットモデルは学習に時間がかかることを考えると、 おそらく、データが集まっていないプロジェクト初期段階で活躍する可能性を秘めています。 ただ、今の所、GridSearchやHyperoptの方が使いやすいです。

アルゴリズムの概要

アルゴリズムは論文にさらっと書かれています。

Efficient and Robust Automated Machine Learning

この論文のポイントは次の2点です。

  • meta learningから、ベイズ最適化をwarm startさせたこと。過去にベイズ最適化で学習させたものを、活用。メタ特徴ベクトル間の距離からtopkを選び、そのconfiguration(ベイズ最適化の探索空間の変数)を選び、それらのconfigurationで学習させることからベイズ最適化がスタートされる。空間は2つあって、メタ学習記録用の空間と、configurationの探索空間の2つです。
  • bayesian optimizationとemsemble selectionを組み合わせた点。meta learningは素人でもまっさきに思いつくけど、途中のアウトプットを組み合わせるのは確かにシンプルで効果的。ディープラーニングではEnsembleがbayesian optimizationより最適になりそうとのことです。

メタ学習には140個のモデルしか使われていないようで、 メタ学習で大まかな開始点が決まるから、メタ学習をうまく活用できていないと、 時間をかけても最終的に得られる性能が低くなってしまう懸念はあります。 なので、データセットによっては性能が低くても不思議ではないです。

インストールして実装する

並列実行刷るサンプルが実用的で役立つので、このサンプルを元に拡張しました。 あとは、APIドキュメントが役立ちます。 結果的にできたプログラムはこんな感じです。 あと、この方法に関しては、日本語のドキュメントもたくさんあります。

得られた結果の詳細を見る

期待と異なる結果が得られた場合や、 どういった結果が得られたか詳細を知る方法についてまとめます。 APIドキュメントには学習以外のことが何故かまとまっておらず... 上記サンプルプログラムのIPython内で実行刷る想定です。

Ensembleされた最終的なモデルの分析

Autosklearnの出力はEnsembleされたモデルです。 Ensembleに使われたモデル一つ一つの詳細を見たりできます。 例えば、下記の例はそれぞれの構成モデルのprecisionを計算します。

refitしていない場合は構成要素からはインデックスが返ってくるので変換します。

for m in automl.get_models_with_weights(): 
   print(sklearn.metrics.precision_score(y_test, np.array(automl._automl[0]._classes).take(np.array(m[1].predict(X_test)))))
    

refitしている場合は、素直です。

for m in automl.get_models_with_weights():  
    ...:    print(sklearn.metrics.precision_score(y_test, np.array(m[1].predict(X_test))))

探索された全モデルの分析

探索空間を調べるためのpublicメソッドは提供されておらず、 プライベートメンバにアクセスしなければなりません。 下記のコードは探索された全モデルのprecisionを計算します。

これはrifitしていない場合です。

import pickle 
 
scores = [] 
model_paths = [] 
for model_path in automl._automl[0]._backend.list_all_models(-1): 
    try: 
        model = pickle.load(open(model_path, 'rb')) 
    except EOFError: 
        print(f"skip eof error {model_path}") 
        continue 
    
    scores.append(sklearn.metrics.precision_score(y_test, np.array(model.predict(X_test) + 1)))
    model_paths.append(model_path)
     
scores = np.array(scores) 
scores.max()

refitするとエラーがでますが、原因は不明。 どちらにせよコードを読まないとだめな気がします。

単純な分類器を使いデータ収集を加速させる

背景

ラベル付きのデータセットを作る際に発生頻度が低いクラスを集めるのが難しいという問題があります。 結果、そのクラスの学習検証データ数が少なくなり、そのクラスやそのクラスに近いクラスの分類精度が下がるという問題が予想されます。 こういった場合にSVMなどの単純な最適化パラメータ数が少ない分類モデルで ある特定のクラスの可能性が全く内データだけ排除したデータにラベル付していくことで、 発生頻度の少ないクラスのデータを集められる気がします。

そういった分類器の構築方法を考えます。

アプローチ

二値分類器でラベルを収集対象クラスとその他のクラスを作り、 収集対象クラスを選択すると、そのクラスのラベル付だけ促すような アノテーションツールを考えます。

それ以外の問題の捉え方として、 マルチタグ付け多値分類問題を解くモデルを作るという方法があります。 確実に〜ではない分類をしたいので、所属クラスを一つに絞り込みたくないんどえ、 単純な達分類としては実装したくありません。

二値分類機を複数作ると、 ラベルの個数Nに対して、$\Theta(N)$回の学習をする必要があります。 ラベル付きデータが増えるに応じて、再学習させるような設計にするでしょうから、 ラベル付きデータが一定位数増えるたびにこの学習をすることになり、 効率は悪いように見えますが、SVMの多値分類では複数の分離平面を計算するので、 そこまで大きな差はつかないはずです。(実装の最適化レベルでSVMで多値分類するほうが早そうです)

後者の方法が楽そうです。 SVMの分類方法でone-versus-rest方があり、 その方法はマルチタグ付与問題と親和性がありそう。

なので、ラベルじゃないものは明らかなものだけ分類する分離平面を作り、 one-versus-restで分離平面の収集対象ラベル側にデータがある場合に、 そのタグをつければ良い。1クラスへの分類より実装は楽なはず。ライブラリの実装もありそうです。

特徴量設計

特徴量が不足した場合、不足した特徴を全く加味しないのと同様です。 また、SVMは高次元でもうまく関係ない次元を無視してくれるので、 不足より、多すぎる。を目指して設計します。

指標

ラベル付きがpositiveと考えたとき、

  • decrease the number of false negative
  • create a highest-recall classifier

is the evaluation metrics of the binary classifier under the one-versus-others classifier.

実装方法

クラスの所属を示したバイナリマトリックスを渡すだけでできそうです。 二値分類器でOne-versus-othersをするクラスが用意されていて、 それもマルチラベルシングルラベル両方対応しえいるので、 簡単に実装できそうです。用意されているサンプルもシンプルで、二値分類多ラベル問題をシンセティックデータ上で動かしているだけです。

大体実装方法はこんな感じです。

執筆を楽にしそうなVSCodeの機能

背景

文章執筆速度を上げたく、 文章を書くプロセスとしては、

  • 普段はひたすら書き溜める
  • ある程度ネタが溜まったら、まとめて一つの記事にする
  • 少し手直し

という流れです。割とボトムアップに記事を書いています。

編集速度を上げそうな機能

この場合、文字を打つだけではなく、 コピーして移動したり、章を分けたりくっつけたりして、 構成を変更したりすると思います。 この仕事を楽にするために章や節ごとに大きめの粒度でテキストを選択したり、移動したり、 文章の概観を見れる機能がほしいです。

文章の概観を見る機能

左サイドバーのexplorerタブのoutlineに表示されています。 markdownだとここにすべてのheadingが表示されるので、 全体の構成を把握できます。Explorerの表示順序は変えられるので、 私は、1.Outline, 2.File Explorer, 3.Open Editorsにしています。

また、fold/unfoldの機能を使えば、 好きなレベルのheadingを見れるので、 これで章の構成などを考えられます。

大きめの粒度でテキストを扱う機能

foldingして選択すると、簡単により大きな単位で選択して切り取りしたりできます。

shfit+alt+right/leftで選択範囲の拡大ができますが、 この機能はmarkdownではあまり役に立たないようです。 二回押すと行の選択ができます。