; oi

2017年4月18日火曜日

【SPRINT】Googleで培われた最速な問題解決プロセス

本書の概要

SPRINTとは、Googleの中で培われた短期間(5日間)で、問題を見極め、解決のためのアイデア評価を行い、答えを出す手法である。下記の図で示すように、通常ビジネスにおいては必要な、ビルドやローンチといったプロセスをスキップして、アイデアの良し悪しを学ぶことを可能とする。

Shortcut [the Design Sprintより引用]


本書は、SPRINTについての体系だった説明というよりは、具体的な実践方法が詰め込まれた一冊である。「リーンスタートアップ」よりも速く答えを出すための工夫が、「イシューからはじめよ」よりも実践的で現実に即した内容が盛り込まれている。

例えば、進行役が注意すべき点や、被験者の集め方に加え、文房具の準備の方法や、おすすめのランチのタイミングなど、実践知に基づき、実際にSPRINTを実施して問題解決するための細かいTipsまで記されている。加えて、本書末尾の付録には、SPRINT実施のための留意点をまとめたチェックシートがついており、実際に問題解決策のアイデア出し&評価を実施するためには、ぜひ参考にしたい内容だ(本書をそばに置きつつ、まずはSPRINTの試してみて、その効果を見定めるのはアリだと思う)。

しかしながら、本書は残念な点も多い。章の頭や途中に、方法の説明と前後する形で事例が記載されており、しかも、小説調や語り調で書かれているため、読みにくかったように思う。個人的には、洋書特有の緩い表現をを排して、見出しを構造化して事例は最後にまとめるなどすれば、より読みやすい書籍となったように思う。また、副題に「最速仕事術」とあるが、「仕事」という表現は少しもったいないように思う。本書でいう「仕事を最速に行うこと」は、チームとして問題の特定から、解決アイデアの評価を最速で行うことであり、一般的に「仕事」という言葉が指すことの多い、個人の決まった作業の効率化という内容とは一線を画すからである。

SPRINTの重要な考え方

SPRINTの中で特に重要と感じた考え方について列挙する。

  1. 役割とプロセスの明確化と合理化
    • 問題を深掘りする際の課題の洗い出しなどは、専門家を招聘して実施し、出来上がったプロトタイプの評価は被験者を集めヒアリング評価を行う。また、チームで集めたアイデアの素材は共有し、それを基にメンバは個人でソリューションを考え、スケッチにまとめる。またメンバは投票を行い、意思決定者が最終的にソリューション案を決定する。このように誰がどれを行うかが明確になっており、無駄がなく、合理的である。
  2. 問題の見極めとフォーカスを尊重
    • いきなりソリューションを考えるのではなく、まず問題をしっかりと特定し、チームとして認識し、明確なターゲット(どの顧客の何の瞬間)を定める。
  3. 解決策立案のための素材収集の効率化
    • 定義された問題を解決するための既存のアイデアを持ち寄って、デモを行いチームに共有する。チームは、共有された既存アイデアを改善させたり、組替えたりすることで新しいアイデアを醸成する。
  4. 解決策のアイデアは具体化
    • ブレインストーミングより個人のアイデア出しの方が優れていることは立証済であるため、個人でアイデア出しを行う。また、抽象的なアイデアの場合、感情や主観によって捉え方や評価が変化しやすいため、アイデア自体を公平公正に評価するため具体化を行い、スケッチにまとめる。
  5. アイデアの意思決定/合意形成の効率化/主観の排除
    • 「メンバの品評→メンバの投票→意思決定者の決断」というようにプロセスを決めておくことで、好き勝手に自由なタイミングで品評する無駄な時間を省くことができる。匿名にするなどして、アイデアを公平に客観的に評価できるような工夫をする。

SPRINTの実施内容

本書に記載されたSPRINTのキーワードを、備忘録として曜日ごとに整理しておく。

◼︎月曜日:問題を見極め、特定する ※いきなりソリューションから入らない
長期目標:プロジェクトの1年後に目指すところ
スプリントクエスチョン:スプリントの最後にどのような問いに答えられるか?
マップ:顧客が製品/サービスを利用する流れを整理したもの
専門家にきく:マップを確かめる、課題を知る
どうすればメモ:課題に対して、どうすれば〜という形でまとめる
ターゲットを決める:本SPRINTでどこにフォーカスすべきか?
 ・重要な顧客は誰か?
 ・体験の中で最も重要な瞬間はいつか?
 ・インパクトがある/重要そうなところ

◼︎火曜日:問題解決のアイデアを具体的なスケッチにする
光速デモ:改良と組替えに焦点をあてる。既存のアイデアで使えそうなものを3分でプレゼン。月曜からの宿題でも良い。

メモ: ベストな素材を集める
アイデア: なんでも書く
クレイジー8: アイデアのバリエーションを高速に洗い出す
ソリューションスケッチ:3コマでまとめる:全員が個別に作成する、抽象的なアイデアは誤って評価される、ブレストより個人の方が良いアイデアがでるのは証明済。

◼︎水曜日:解決策の決定とプロトタイプのストーリー作成
ソリューションスケッチの決定:投票して勝者を決める
ストーリーボード:プロトタイプの計画を立てる

◼︎木曜日:リアルなプロトタイプの作成
ファサード:完璧→必要最低限、長期品質→一時的なシミュレーション
プロトタイプ思考:
 ・短時間でリアルさを得る。
 ・時間をかけすぎない。

◼︎金曜日:生身の人間による評価
現実なユーザーによるテスト(5人):それ以上は費用対効果が微妙。

参考情報

The Design Sprint http://www.gv.com/sprint/

2017年4月2日日曜日

赤ちゃん用バケットハットの作り方

バケットハットの型紙に必要な情報

入力(作りたい帽子の大きさ)

トップクラウンの円周 $a$(cm)
サイドクラウンの下円の円周 $b$(cm)
サイドクラウンの下円の幅 $l_1$(cm)
ブリムの外側(下側)の円周 $c$(cm)
ブリムの幅 $l_2$(cm)
Center Line(cm)
Scale(cm)

出力(型紙作成に必要な情報)

$r_a$ 0 (cm)
$r_b$ 0 (cm)
$L_a$ 0 (cm)
$L_b$ 0 (cm)
$\phi_1$ 0 (°)
$r_c$ 0 (cm)
$L_b'$ 0 (cm)
$L_c$ 0 (cm)
$\phi_2$ 0 (°)

2017年3月12日日曜日

【続報】流行りの格安SIMに乗り換えてみた(iPhone SE 64GB SIMフリー版+FREETEL SIM for iPhone)

2016年6月に、流行りの格安SIMに乗り換えてみた(iPhone SE 64GB SIMフリー版+FREETEL SIM for iPhone)のポストで、格安SIMに乗り換える方法と乗り換えた場合の費用計算シミュレーションについて述べた。

今回は、2016年6月から2017年2月までのFREETELの利用実績を基に、想定利用金額を再設定し、費用計算シミュレーション結果を記載する。

利用料金の実績

まず、2016年6月から2017年2月までのFREETELの利用実績を以下のグラフに示す。
7月〜12月の6ヶ月間は、FREETELの「最大1年間0円キャンペーン」によって、1GB分の料金(499円)が差引かれている。
割引分499円を当該月に加算し9ヶ月の平均を算出すると、2,430(円/月)程度となった。

利用料金の内訳

次に利用明細(2016年12月分)を以下の表に示す。前回のポストでは、データ通信量(以下の表では基本使用量と記載)のみを考慮して費用計算を行っていた。しかしながら、実際利用してみると、LINEなどの無料通話、メールだけでは連絡できない場合が多々あったため、通話料およびSMS送信量が発生した。
また、データ通信料については、9ヶ月のうち7ヶ月が、3GB未満の利用であった。これは、そもそもデータ通信を行わないこととと、wifi環境が充実してきたためと考えられる。


ご利用明細
摘要ご利用月課税料金
◆基本使用料
使った分だけ安心プラン(ドコモ回線)for iPhone 音声通話付2016/12外税¥1,600
最大1年間0円キャンペーン第5弾( 6ヵ月)2016/12外税-¥499
◆通話料
国内音声通話料2016/11外税¥580
国内SMS送信料2016/11外税¥12
◆その他
ユニバーサルサービス料(1番号当たり3円の請求となります)2016/12外税¥3
小計(課税対象)¥1,696
消費税¥135
小計(内税/非課税)¥0
合計¥1,831

実績に基づく費用計算シミュレーション

最後に、利用実績に基づき、今後の累積利用料金をシミュレートしたグラフを以下に示す。
比較のため、以前利用していたSoftbankを使い続けていた場合(月額8,800円)の累積利用料金をグラフに追記している。FREETELのイニシャルコストについては、流行りの格安SIMに乗り換えてみた(iPhone SE 64GB SIMフリー版+FREETEL SIM for iPhone)のポストを参照されたい。
このグラフを見ればわかるように、2017年の5月にグラフの交点が存在し、約1年の利用で、イニシャルコストを回収できていることがわかる。2年間(2018年5月まで)利用できれば、76,440円((8,800円ー2,430円)×12ヶ月)費用を抑えられることになる。

まとめ

格安SIMに乗り換えてみた結果、実績値としても大手キャリアに比べて、費用を大きく抑えられることがわかった。「格安SIMはなんだか怪しそうだ、なんだか移行が面倒そう」と思っている方でも、本ポストをご覧いただいて一歩を踏み出していただければ幸いである。

2017年2月3日金曜日

LINEの自作スタンプを作ってみた(2)

1月6日(金)に申請したLINEスタンプ。
LINEの自作スタンプを作ってみた(1)

年末年始の関係で審査期間が通常より長くなるという記載があったものの、ちょうど1週間後の1月13日(金)に審査完了、無事に承認され、販売開始することができた。
審査完了の通知はLINEで連絡がくるため、タイムリーに状況把握することができてとても便利だった。

思った以上に簡単に完了したため、追加で別のスタンプも作成することにした。
今度は40個のスタンプである。




だんだんイラストソフトの操作も慣れてきて効率よく作成できるようになった。
出来上がったイラストがこちら。(下書きと順序はバラバラ)



40個もあると普段の会話に使えそうである。
来週ごろに使えるようになるのが楽しみだ。

2017年1月6日金曜日

LINEの自作スタンプを作ってみた(1)

以前から気になっていたLINEの自作スタンプ。
素人でも簡単にオリジナルスタンプを作成して販売できるとのことで、少し自由な時間が増えたことをきっかけに、初トライしてみた。

イラスト作成に使用したツールは以下の無料ソフトのみ。

フリー ペイントツール (Mac/Win 両対応) FireAlpaca [ ファイア アルパカ ]


そして以下の手順で行った。

①アイディア出し
 まずは普段の会話などで使えそうなワードをリストアップするところから始めた。
 以前はスタンプを42個作成する必要があったが、現在は8個から申請可能ということで、今回は16個を目指してアイディア出しを行った。

②キャラクター決定
 本来ここはこだわるべきところではあるが、イラスト作成に関してはド素人のため、自身で描きやすいキャラクターにせざるを得なかった。
 少なくとも16個は描かないといけないため、シンプルで表情や動きをつけやすい、ネコのキャラクターにした。




③下書き
 キャラクターが決まったので、①のアイディアを元に、構図や表情、ポーズなどを検討した。ここではレポート用紙に鉛筆で描くような簡単なものでOK。



④イラストデータ作成
 下書きした用紙をPCに取り込む。
 本来はスキャンすべきなのだが、プリンタを出すのが面倒だったのiPhoneで写真を撮り、画像を転送するかたちを取ったがそれで十分だった。取り込んだ画像を元に、firealpacaで清書、色付け、書き出しを行う。
 LINEスタンプのガイドラインが決まっているので、その画像サイズに合うように注意して作成する。

 出来上がったのがこちら!




⑤クリエイター登録
 LINE CREATERS MARKETに必要情報を入力し、登録する。
 

⑥スタンプをアップロード
 登録が完了するとスタンプをアップロードすることができる。
 タイトルや説明文などを先に入れる必要がある。

⑦審査のリクエスト
 無事すべて揃ったら審査をリクエストする。

現在、ここまで完了したところであり、無事承認が下りれば販売開始、ということになる。
また進展があれば続編を投稿したい。

続編を追記しました(2017/2/3)
LINEの自作スタンプを作ってみた(2)



2016年12月4日日曜日

今更聞けないEMアルゴリズムの解説〜潜在変数が連続変数の場合のEステップの説明〜

$\boldsymbol{z}_i$が連続変数の場合について、変分法によって確率分布$Q(\boldsymbol{z}_i) $を求める方法も追記しておく。

すなわち、以下を示す。
$$
\begin{eqnarray}
Q(\boldsymbol{z}_i)  &=& P( \boldsymbol{z}_i \mid \boldsymbol{x}_i, \boldsymbol{\theta})
\end{eqnarray}
$$

E-Stepの説明(潜在変数が連続変数の場合)

E-Stepでは、$\boldsymbol{\theta}$固定の下、尤度関数の下界の分布を最大化する。以下で尤度関数を変形し、下界を求める手順を示す。

$$
\begin{eqnarray}
\displaystyle \sum_{ i = 1 }^{ N } \ln P( \boldsymbol{x}_i \mid \boldsymbol{\theta}) &=& \displaystyle \sum_{ i = 1 }^{ N } \ln \displaystyle \int P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta}) d\boldsymbol{z}_i\\
&=& \displaystyle \sum_{ i = 1 }^{ N } \ln \displaystyle \int Q(\boldsymbol{z}_i)\frac{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})}{Q(\boldsymbol{z}_i)} d\boldsymbol{z}_i\\
&\geq&  \displaystyle \sum_{ i = 1 }^{ N }\displaystyle \int Q(\boldsymbol{z}_i) \ln \frac{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})}{Q(\boldsymbol{z}_i)}d\boldsymbol{z}_i
\end{eqnarray}
$$

(2)式から(3)式への変形は、$\boldsymbol{z}_i$の任意の確率分布$Q(\boldsymbol{z}_i) $でかけて割っただけである。この時、$Q(\boldsymbol{z}_i) $は何ら仮定をおいていないことに注意されたい。
(3)式から(4)式への変形は、Jensen's Inequalityを利用した。

この時、$\boldsymbol{\theta}$固定の下、下界(4)式の最大化を考える場合、変分法を用いれば良い。下界(4)式を$Q(\boldsymbol{z}_i) $の汎関数(関数の形を変化させると値が変化する関数。わかりやすい説明は「物理のかぎしっぽ(変分法1)」を参照されたい。)と捉え、変分法によって極値を求める。

特に、$Q = Q(\boldsymbol{z}_i) $とした時、$\boldsymbol{z}_i, Q$によって決まる、以下のようなシンプルな汎関数を考える。

$$
\begin{eqnarray}
\displaystyle \int f( \boldsymbol{z}_i, Q) d\boldsymbol{z}_i
\end{eqnarray}
$$

このシンプルな汎関数を求めるための、オイラー・ラグランジュ方程式は、以下で表せる。(その他の汎関数のオイラー・ラグランジュ方程式については、「物理のかぎしっぽ(変分法2)」を参照されたい。)

$$
\begin{eqnarray}
\frac{ \partial f }{ \partial Q }
\end{eqnarray}
$$

よって、下界(4)式の積分部分に注目し、$\int Q(\boldsymbol{z}_i) d\boldsymbol{z}_i =1$の制約を加えた汎関数は以下となる。

$$
\begin{eqnarray}
\displaystyle \int Q(\boldsymbol{z}_i) \ln \frac{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})}{Q(\boldsymbol{z}_i)}d\boldsymbol{z}_i - \lambda (1- \int Q(\boldsymbol{z}_i) d\boldsymbol{z}_i )
\end{eqnarray}
$$

これを$Q$で変分すると以下を得る。
$$
\begin{eqnarray}
\ln \frac{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})}{Q(\boldsymbol{z}_i)}+Q(\boldsymbol{z}_i) \cdot \frac{Q(\boldsymbol{z}_i)}{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})} \cdot \left[- \frac{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})}{Q(\boldsymbol{z}_i)^2} \right] + \lambda = 0
\end{eqnarray}
$$
$$
\begin{eqnarray}
\ln \frac{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})}{Q(\boldsymbol{z}_i)}  = -\lambda + 1
\end{eqnarray}
$$
$$
\begin{eqnarray}
Q(\boldsymbol{z}_i) = e^{\lambda - 1}P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})
\end{eqnarray}
$$

$\int Q(\boldsymbol{z}_i) d\boldsymbol{z}_i =1$より、以下を得る。

$$
\begin{eqnarray}
Q(\boldsymbol{z}_i) &=& \frac{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})}{\int P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta}) d\boldsymbol{z}_i}\\
&=& \frac{P( \boldsymbol{x}_i, \boldsymbol{z}_i \mid \boldsymbol{\theta})}{P( \boldsymbol{x}_i \mid \boldsymbol{\theta}) }\\
&=& P( \boldsymbol{z}_i \mid \boldsymbol{x}_i, \boldsymbol{\theta})
\end{eqnarray}
$$

これは、離散分布を仮定し、EMアルゴリズムのE-STEPを説明した「今更聞けないEMアルゴリズムの解説」の(8)式と合致する。

2016年11月15日火曜日

話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(5)

ケーススタディ

前振りが長くなったが、開発したソースコードを用いて実際に「対話ボット」を学習し、実行した結果を示す。

学習データ

学習には以下の日常で頻繁に利用している家族とのLINEトークデータを用いた。
  • 全LINEトークデータ 17,796ペア(in/out)
  • trainデータ 16,017ペア(in/out)#全データの9割
  • devデータ 1,779ペア(in/out)#全データの1割

ディレクトリ(学習開始時)

学習開始時は、以下の3つのpythonファイルと2つのディレクトリを同階層に配置する。また、line_talk_dataディレクトリには、学習データとして作成した4種類のファイルを格納する。(学習後には中間生成物が各フォルダに生成される)

  • chatbot.py
  • data_utils.py
  • seq2seq_model.py
  • line_talk_data #学習データ格納用ディレクトリ
    • line_talk_train.out
    • line_talk_train.in
    • line_talk_dev.out
    • line_talk_dev.in
  • line_talk_train #学習結果のcheckpointデータ格納用ディレクトリ

学習の実行

python chatbot.py

実行後のコンソールを以下に示す。
chatbot$ python chatbot.py 
Preparing LINE talk data in line_talk_data
Creating vocabulary line_talk_data/vocab40000.out from data line_talk_data/line_talk_train.out
Creating vocabulary line_talk_data/vocab40000.in from data line_talk_data/line_talk_train.in
Tokenizing data in line_talk_data/line_talk_train.out
Tokenizing data in line_talk_data/line_talk_train.in
Tokenizing data in line_talk_data/line_talk_dev.out
Tokenizing data in line_talk_data/line_talk_dev.in
Creating 3 layers of 256 units.
Created model with fresh parameters.
Reading development and training data (limit: 0).
global step 100 learning rate 0.5000 step-time 0.66 perplexity 8820.34
  eval: bucket 0 perplexity 3683.12
  eval: bucket 1 perplexity 4728.98
  eval: bucket 2 perplexity 4118.81
  eval: bucket 3 perplexity 5504.88
以下のように、ある程度収束してきたところで、学習を切り上げる。 今回は以下のスペックのMac book pro にて8時間程度学習を行った。

CPU : 2.9 GHz Intel Core i5
メモリ: 16 GB 1867 MHz DDR3

この時、line_talk_trainディレクトリの中に、学習ステップに応じた .ckptファイルが蓄積されている。対話実行時に、蓄積された最新の.ckptファイルはリストアされる。
global step 17000 learning rate 0.3812 step-time 0.49 perplexity 30.66
  eval: bucket 0 perplexity 29.40
  eval: bucket 1 perplexity 45.61
  eval: bucket 2 perplexity 44.65
  eval: bucket 3 perplexity 85.85
global step 17100 learning rate 0.3812 step-time 0.51 perplexity 30.04
  eval: bucket 0 perplexity 113.59
  eval: bucket 1 perplexity 55.54
  eval: bucket 2 perplexity 39.45
  eval: bucket 3 perplexity 45.94

対話の実行(--decode)

python chatbot.py --decode

--decodeオプションをつけて実行することで、対話モードで実行できる。 以下に「対話ボット」の対話例を示す。 最新の.ckptファイルをリストアされ、対話モードに入っていることが確認出来る。
chatbot$ python chatbot.py --decode
Reading model parameters from line_talk_train/chatbot.ckpt-17600
> 

以下に対話例を示す。 ([Morpho]タグ行)は入力の形態素解析の結果を出力している。
> 今日は何時に帰る?
([Morpho]:今日 は 何 時 に 帰る ?)
00 : 00 くらい か なー !
> 今から帰りまーす
([Morpho]:今 から 帰り ま ー す)
今 から ます !
> おつかれー
([Morpho]:お つかれ ー)
[ スタンプ ]
> 退社しましたー!
([Morpho]:退社 し まし た ー !)
00 : 00 くらい か なー !
> お腹空いたのでゆっくり食べてます〜
([Morpho]:お腹 空い た ので ゆっくり 食べ て ます 〜)
たいしゃ

そこそこの対話ができていることがわかる。
「今日は何時に帰る?」という質問に対して、時刻を返答しようとしていることがわかる。パターンとしては上手く学習できているが、 実際に情報がないので正しい時刻を返せていないのは残念であるが。
「ゆっくり食べてます〜(先にご飯を食べています)」という情報に対して、遅れて「たいしゃ」したというのも、日常でよくあるやりとりを上手く学習できているといえる。
また、LINEトークのテキストデータのみを学習しているため、一部の返答が[スタンプ]になってしまっているのも仕方がない結果であろう。

まとめ

LINEトーク履歴のテキストデータを用いた「対話ボット」を開発してみた結果、個人のLINEトークの返し方を学習し、それっぽい回答をしてくれることがわかった。翻訳と違い、「良い」「悪い」の基準が極めて曖昧なため、評価が難しいのは事実であるが、可能性を感じる結果にはなった。

今後は、データ量を増加させ、時系列を加味して対話データの生成するなど、学習データの洗練を行いたい。また、今回ハイパーパラメータについても、計算量削減のため、デフォルトの設定よりもだいぶ小さい値を用いている。データ量の増加に合わせて、ハイパーパラメータの調整も併せて行うことで、より自然な対話ができるようになると思われる。

参考



話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(1)

話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(2)

話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(3)

話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(4)