pandazx's blog

データ分析など雑多な技術ブログ

サイバーエージェントの機械学習祭りに行ってきた

www.wantedly.com

に行ってきた。以下はメモ。

推薦アルゴリズムの今までとこれから

スピーカー:サイバーエージェント 内藤 遥

推薦アルゴリズムの種類

  • 協調フィルタリング
    • データがないと機能しない
  • コンテンツベース
    • データがなくても大丈夫。商品の特徴量を使う

GroupLens

Matrix Factorization

  • Netflix Prizeで登場したアルゴリズム
  • ユーザの暗黙的評価。閲覧1、お気に入り2、購入3という評価値とするなど

Factorization Machines

  • MFの改善手法
  • ただ、MFより予測の計算量が多い。TopNの算出に時間がかかる
  • 特徴量にドメイン知識が必要

RNN

  • 時間による変遷を考慮できる
  • クライアントブラウザの種類などのコンテキストを考慮できる

Collaborative Metric Learning

  • オンラインで近似的に高速に解ける
  • Amebaで注目してる手法

Amebaの推薦基盤

マルチメディア機械学習の取り組み

スピーカー:サイバーエージェント 藤坂 祐介

アメブロ画像カテゴライズ

  • ブログのAmeba公式ジャンルのカテゴライズを自動化したい
  • NLP+投稿画像認識
  • 内製のラベル付け管理ツールで30万枚の画像をタグ付け
  • 分類精度。t-SNE. top1 82.73%
  • アルゴリズムはKerasでResNet

スパム画像検知

  • エログロなどのスパム画像を検出したい
  • スパム画像は全体の0.1%
  • アルゴリズムはKerasでResNet
  • 教師データは日々の監視業務で作成
  • いい精度が出ていない

次の課題。マッチングアプリで業者が同じようなプロフィール画像を使い回すユーザがいるので検出したい

  • 画像をdhashで64次元に変換
  • Humming距離で類似度を計算
  • 7,8bitで良い精度が出て、実際に使われている

楽曲の盛り上がり検知をやってみた

  • 課題は楽曲のサビ検知
  • メロディ、サビ、その他の3分類で精度評価して、分類精度51%

大規模分散深層学習とChainerMNの進歩と課題

スピーカー:PFN 秋葉 拓哉

  • ChainerMNのMNはMulti Nodeの略
  • 分散深層学習を非同期でやるよりも、同期でやった方が精度が高い。大事なのはスループットではなく精度
  • ChainerからChainerMNに移行する際のコードの変更量は少ない
  • 2016年では分散深層学習すると精度が落ちる。しかし、2017年には精度が保てるようになった。しかも高速
  • 分散深層学習で2-3週間かかっていたものが256GPUsで1時間まで短縮されたが、PFNは1024GPUsで15分まで短縮した
  • 非同期型はネットワークの状況によって学習結果が異なるため、扱いづらい、チューニングしづらいのが難点
  • マルチノード構成にした場合、1Gbでは1台より遅くなる。10Gbで遅くならないぐらい。40Gbで戦えるかもレベルだが、未検証

cronで実行したシェルから呼ばれるRubyスクリプトの標準出力が出力されない

test.sh

#!/bin/sh
ruby test.rb
echo done

test.rb

puts 'hoge'

上記スクリプトがあった場合に、以下のようにcronを設定しても、test.sh のdoneしかtest.logには出力されない。

0 * * * * cd /home/user/tools; sh test.sh >> ./test.log

cronで実行される際、環境変数は実行ユーザでログインした場合はとは異なるという問題もある。

参考:cronで実行時に環境変数を読み込む - Qiita

以下のようにして環境変数を読み込む -l オプションをつけて、-c でコマンドを実行させればよい。

0 * * * * /bin/bash -lc 'cd /home/user/tools; sh test.sh >> ./test.log'

NEDO AI ベンチャーコンテスト採択企業5社の開発責任者が語る開発の最前線に行ってきた

【エンジニア向けイベント】人工知能の未来を語る ~ NEDO AI ベンチャーコンテスト採択企業5社の開発責任者が語る開発の最前線 ~
https://techplay.jp/event/658548

 

■1社目 Hmcomm
音声認識をやっている。音のプラットホームがライセンスビジネスで、その上にある音のソリューションで、SI向け

 

事例

  • 受付に人のいないホテル
  • 工場などの騒音環境で、雑音除去
  • コールセンターのオペレータとお客様の会話を音声認識して、帳票出力
  • 対話の返答は自動生成
  • 駅の遺失物問合せの自動対応

 

End2Endの音声認識

音声波形をCNNで画像認識的なアプローチを研究中。

 

マイク素子の単価が下がってきており、ハードウェアが作りやすくなってきている。

 

チューニングレスな最新手法の実利用はまだ難しい。まだ、チューニングが必要な状況。

 

マシン2テキストを研究中。

 

■2社目 アースアイズ
五感AIカメラ

  • 五感の内の1つ、目に関する機能について。
  • カメラが自動的に不審者を発見する。
  • 予測、予知して未然防止。
  • 独自に3D測距カメラを開発。20cm四方エリアに区分できる特許技術を保有

 できること

  • 人流分析:人の頭の位置をトラッキング
  • 商品移動:物が置かれた、持っていかれたことの認識
  • 万引き検知:ハードウェア費を除いた2350円/月

 

不審検知はレーザーでやってるので、夜でも大丈夫

万引き犯以外の泥棒などにも応用可能。イチからの開発は不要。

 

検出時の店員への伝え方

  • アプリを提供している。
  • カメラから音声を流したり、光ったりする。

 

■3社目 シナモン
契約書類関連のバックオフィス業務を改善

 

プロダクト

  • 文書読み取りエンジン。flax sccaner
  • チャットボット
  • レコメンデーション

 

今日はflax sccanerについて。

  • 不特定の帳票から必要な情報を読み取る。
  • pdf、word、メールなどに対応。

事例:銀行証券、保険の書類業務効率化

 

DLモデルを作るのは全体の一部で、システムとして成立させるためには、前処理、validationや変換などソフトウェア開発の方が比重が大きい。

 

ベトナムの大学からハイアリングする仕組みが出来ている。AIチームが30人。500人体制にしていきたい。

 

どのぐらい作業時間短縮につながる?ビジネス的な評価KPIは?

  • PoCで50人を25人にするぐらいの効果が得られている。
  • 契約書の処理はAIでの自動判断が許されないので、人がダブルチェックできるなどのアプリを提供している。すべてをAIで自動処理は目指していない。

 弁護士業務の単純作業は自動化できる。

 

■4社目 SOINN
Self Organization Incremental Neulal Networksの頭文字がSOINN

  •  汎用型の人口知能。社内で育てる人工知能
  • 教師なしクラスタリング
  • クラス数も自動算出。
  • 学習量が少ない。
  • 画像なら400枚実運用投入したこともある。地中レーダーをつけた車で走って、地下の地盤沈下の危険性をチェック。危険箇所の検出

 

目視検査。現場で熟練者がトレーニングして学習させる。

今回のNEDOではスマホでこの人工知能を育てるプロジェクト。

 

■5社目 BEDORE
対話型IFによる非構造化データ検索

対話エンジンがあり、接客、コールセンターの自動化、半自動化

 

シェルで二重起動防止

以下では、cronから実行すると常に二重起動と判定されてしまう。

OLDEST=$(pgrep -fo $0)
if [ $$ != $OLDEST ]; then
    echo "[ERROR] 二重起動を検知したため、$0 の実行を中止します。"
    exit
fi

そのため、以下のようにする。

OLDEST=$(pgrep -fo $0)
if [ $$ != $OLDEST ] && [ $PPID != $OLDEST ]; then
    echo "[ERROR] 二重起動を検知したため、$0 の実行を中止します。"
    exit
fi

理由は以下を参照。

障害メモ/cronからキックすると多重起動判定ミスする - ポケットがチケットでいっぱい

Team AI Meetup #1に行ってきた

スライド写真は後でUP

mercari.connpass.com

アジェンダ

  1. 「What can image recognition & machine learning do for Mercari?」 by 山口 拓真
  2. 「メルカリにおける機械学習システム基盤について」 by @Hmj_kd
  3. Q&A

What can image recognition & machine learning do for Mercari?

  • DNNのInception-v3でerror rate 29.3%。AWS上で評価
  • 誤認識した例:デザインがほぼ同じだが、靴のサイズが違うだけでメンズとレディースで違う。ヒトでも困難
  • うまくいった例としては、詳細カテゴリは間違うが、キッズ用品かどうかは当たることが多い。
  • ブランド認識と認識で注目した領域の可視化
  • アイテム詳細情報の推定
    • 5000万枚学習
    • 推定した結果をユーザが商品登録時の初期カテゴリとして使用(ユーザの操作負荷軽減)
    • 推定した結果をユーザが検索する際の色指定にも対応できる。青いスカート、赤いスカートなど
    • 色推定する際に重要な領域は識別でアテンションの高い領域を利用
  • Image Recognition System Architecture
    • GAEを基盤にkubernetes, docker, spinnakerを利用
    • Mercari APIから上記GAE上のImage Recognition APIを実行
    • Image Recognition API内ではキューを挟んでワーカーが動作
    • 推定はCPUで運用。GPUは使っていない。350msec/req程度で処理できれば現状は十分
  • 画像検索
  • ネットワーク
    • ブランド判別や商品アイテムの詳細推定は1つのネットワークで実現している
    • 計算コストの低減はPCAで次元圧縮

メルカリにおける機械学習システム基盤について

  • 機械学習システム基盤のコンセプト
    • メインアーキテクチャはkubernetes
    • 特定ベンダー非依存
    • ローカルと本番で同一実行環境
  • Architecture Overview
    • 写真参照
  • Workflow
    • 写真参照
  • 2018年以降の予定
    • 2-4モデルが稼働中
    • 精度を監視して更新する機構
    • OSSに向けて(予定)
  • プロジェクト体制は3-4名

Q&A

  • 画像検索による商品検索の精度の現状と短・中期的な達成度合いの見通し
    • 画像検索は直近1,2ヶ月であれば対応できるが、全画像は1億枚以上あり、対応がインフラ的にもアルゴリズム的にも困難
  • 論文の手法そのままではなく、メルカリ独自の工夫はある?
    • そこまで最新アルゴリズムは使っていない。Inception-v3はパラメータ数が少なかったり、クセがわかっているので使っている
  • アカデミアとの関わりは?
  • 機械学習プロジェクトをどう進めている?
    • ビジネスサイドとの軋轢。コミュニケーション。デモをすぐに作ってイメージ共有を行う
    • コミュニケーションのための事例集を作っておく
  • 画像検索の新カテゴリ対応の課題はある?
    • 特にしていない。ユーザから得られたデータ次第

VBAで多次元配列を多次元辞書(連想配列)に変換

入力データが多次元配列でコメントと日付が入ったデータとする。

これを変換して、辞書のデータ構造が年→月→日→辞書(リスト風)→辞書というデータに変換する。

辞書(リスト風)はキーを0,1,2,3というようにして辞書を登録することを意味する。

VBAの設定として、辞書(Scripting.Dictionary)を使用可能にするため、 Visual Basic Editor画面からツール→参照設定でMicrosoft Scripting Runtimeにチェックをつける。

VBAのコードは以下のようになる。動作確認していないが、概ね以下のイメージ。

Function convertList2Dict(dataList) As Scripting.Dictionary
    Dim yearMonthDayDataDict As New Scripting.Dictionary
    Dim dataDict As New Scripting.Dictionary
    
    Dim idx As Variant
    For idx = LBound(dataList) To UBound(dataList)
        ' 日付を取得し、年月日を抽出
        Dim dateStr As String: dateStr = dataList(idx, 1)
        On Error GoTo Errorhandler
        Dim dateObj As Date: dateObj = dateStr
        Dim yearNum As Integer: yearNumAs = year(dateObj)
        Dim monthNum As Integer: monthNum = month(dateObj)
        Dim dayNum As Integer: dayNum = day(dateObj)
        
        ' 辞書の生成と値の設定
        Set dataDict = New Scripting.Dictionary
        dataDict .Add "comment", dataList(idx, 0)
        dataDict .Add "date", dataList(idx, 1)
        
        ' 該当年の辞書を取得。未登録なら作成
        If Not yearMonthDayDataDict.exists(yearNum) Then
            yearMonthDayDataDict.Add intersectionName, New Scripting.Dictionary
        End If
        ' 該当年、月の辞書を取得。未登録なら作成
        If Not yearMonthDayDataDict(yearNum).exists(monthNum) Then
            yearMonthDayDataDict(yearNum).Add monthNum, New Scripting.Dictionary
        End If
        ' 該当年、月、日の辞書を取得。未登録なら作成
        If Not yearMonthDayDataDict(yearNum)(monthNum).exists(dayNum) Then
            yearMonthDayDataDict(yearNum)(monthNum).Add dayNum, New Scripting.Dictionary
        End If
        ' 辞書を多次元辞書に登録
        Dim listIdx As Integer: listIdx = yearMonthDayDataDict(yearNum)(monthNum)(dayNum).Count
        yearMonthDayDataDict(yearNum)(monthNum)(dayNum).Add listIdx, dataDict
NextData:
    Next idx
    On Error GoTo 0
    Set convertList2Dict = yearMonthDayDataDict
    Exit Function
Errorhandler:
    ' エラーが発生すると、ここに飛ぶ
    ' 不正な日時はスキップ
    Resume NextData
End Function

DynamoDBストリームをLambdaで読み込むと24時間前から開始される

DynamoDBストリームを読み込んでLambdaで処理する実装を行った際に勘違いしたことがあるので、メモ。

DynamoDBにはストリームという更新情報をストリームで流す機能があり、 更新発生をトリガにLambdaで処理することが可能。

ストリーム機能を有効にした際に、有効にした時点からの更新のストリームが流れるのではないことに注意。 ストリームデータは24時間保持されるが、それは有効にする前から保持されているため、 ストリームを読み込んでLambdaが動く場合、Lambdaに入力として渡されるデータは24時間前から始まる。

24時間前のストリームから、追っかけ再生的にLambdaの処理が進んでいくため、 最初は書き込みキャパシティの値を大きくしないと、処理が追いつかないので注意すること。

参考: DynamoDB ストリーム を使用したテーブルアクティビティのキャプチャ - Amazon DynamoDB