Self Reference Ngin

アウトプットの練習・テクノロジーについて

unstoppable

目次

  • 『マーティ・ケーガンによる序文』
    • 強力な製品開発チームと、非力なチームの重要な違い
      • 強力なチーム
      • 非力なチーム
  • 所感
  • unstoppable

『マーティ・ケーガンによる序文』

ユーザーストーリーマッピングという本が会社にあったので手に取ってみたら、eBayなどのマネージャーをやってたマーティ・ケーガンという人物から寄せられた序文に、製品開発に優れたチームと非力なチームの特徴に関する知見が述べられていたので、ざっと箇条書きにしてまとめた。

強力な製品開発チームと、非力なチームの重要な違い

強力なチーム

  • 使命感と言えるほどの情熱を持って追求したくなる圧倒的な魅力のあるビジョンがある
  • リアルな問題を解決するために、下記のデータをよく見ながら研究する
    • スコアカードKPI
    • 顧客の苦闘の状況
    • 顧客が製品を使ったときに生成されるデータ
  • 絶えず新技術を応用するチャンスを探しながら、ヒントやアイディアを掴んでくる
  • もっとも大切なステークホルダーは誰か、そのステークホルダーがどのような制約を抱えているかを理解している
  • ユーザーと顧客のためだけに役立つだけでなく、ビジネスの制約の枠内で作れるソリューションを作り出すことに力を注いでいる
  • そのアイディアが構築に値するのかを見極めるために、アイディアをすぐに試せるテクニックに習熟している
  • 社内各部署の優秀なリーダーを集めたブレーンストーミングを積極的に行う
  • 製品担当、デザイン担当、技術担当が隣同士に座り、機能・UX・実現するためのテクノロジーにおける助け合いを推進している
  • イノベーションのためにいつでも新しいアイディアを試そうとするが、収益とブランドはきっちり守る
  • 力のあるインタラクションデザインなど、勝てるために必要なスキルセットの確保にこだわる
  • エンジニアが毎日ディスカバリープロトタイプを試す時間を持っている
  • 顧客をよりよく理解し、最新のアイディアに対する顧客の反応を見るために毎週顧客と直接議論をする
  • 自分たちが気に入ったアイディアの多くが顧客の役には立たないことを知っており、役に立つかもしれないものでも、望ましい成果をあげるためには数回のイテレーションが必要だと知っている
  • スピードの重要性を知っていて、イノベーションで鍵を握るのがイテレーションの早さであることを理解している。ここでいうスピードは、適切なテクニックによって得られるもので、時間労働のようなもので得られるものではないこともわかっている
  • 顧客からの要求をよく吟味し、顧客と自社の業績に貢献できそうなソリューションだと確信したら、その実現のために力を注ぐ
  • フィードバックの仕組みを作る。製品がどのように使われているかを素早く知り、そのデータに基づいて製品に調整を加える
  • コンスタントに小規模なリリースを重ねた方が顧客に安定したソリューションを提供できることを知っている。そのため継続的にインテグレーション、リリースを行う
  • 重要な顧客のことで悩む
  • ビジネスKPIに大きなインパクトを与えられたときに祝杯をあげる

非力なチーム

  • 報酬しか考えない
  • 営業や顧客から要件を集めてくる
  • ステークホルダーから要件を集めてくる
  • 優先順位を指定したロードマップを作るために会議を開く
  • チームの外の誰かが提案してくれても反発する
  • それぞれの部門の席に座り、部門の外からのサービスの依頼には、文書による依頼や会議の日程調整を要求する
  • テストの実行許可を待ち続ける
  • インタラクションデザインがどのような仕事かさえ知らない
  • 急ぎの案件のときだけ、見積書を作るためにプロトタイプを見せる
  • 自分がお客さんだと思っている
  • ロードマップに載ったものを作り、納期と要件を満たしていれば満足してしまう
  • 同僚が働いてくれないからペースが上がらないと不満を言う
  • 営業に振り回される会社だと文句を言う
  • 分析、レポート機能を、あると良い機能だと思っている
  • 苦痛に満ちたインテグレーションフェーズの最後にマニュアルでテストを行い、それからすべてをまとめてリリースする
  • 競合他社のことで悩む
  • 何かをリリースできたときに祝杯をあげる

所感

優れたチームについては、なんか所どころ聖徳太子みたいなこといってんな〜とか思うけど、営業・エンジニア・デザイナー・マネージャーが障壁なくコミュニケーションを取れるチームは目指していくべきだと思う。非力なチームについては端的によくまとまってるし、チームじゃなくて個人にも当てはまる条項なので、マインドセットとして取り入れていきたいところ。

ユーザーストーリーマッピング

ユーザーストーリーマッピング

今月から毎週ブログ書いてるけど、だんだん楽しくなってきたので、次のフェーズに行こうと思っていて、業務用ではないgithubのアカウントを作成した。

github.com

毎日ここで草生やすことにした。
ルールはなんでもありで、ドキュメントでもバイナリファイルでも何でもcommitして、とにかくアウトプットすることを優先する。
このルールでひとまず100日ぐらいやってみようと思う。動かす手を止めないことが大事で、質は度外視する(あとからついてくることを信じている)。

とりあえず、やろうと思ってできなかった自然言語処理100本ノックをちまちま解いてきます。適当にpythonでやります。 github.com

unstoppable

今日のブログを書きながら聴いた曲


ノリアキ - unstoppable / Noriaki - unstoppable

butter sugar cream

charitst.jsについて

jsベースのグラフ描写フレームワーク。今日初めて知った。グラフ描写の設定をCSSで設定できる。
直感的に記述できることと、アニメーションのセンスが個人的にツボだった。
下の図はhttps://gionkunz.github.io/chartist-js/のサンプルコードを少しいじってみたおもちゃグラフ。
数字入れ替えたり色を決めて結果を見てるだけでとても楽しい。






数学ができたら、もっと楽しい絵が描けるかもしれない。
表現方法を学べば、データで、もっとたくさんの人にメッセージを伝えられるかもしれない。
そういったポップな設計思想が多分あるんだと思う。

markdownはてな記法

今のところブログの編集ははてなから直にやってるのだけど、はてなmakedownだとなぜかCSSを読み込まなかった。
はてな記法だとちゃんとCSSを読んでくれたけど、デフォルトの見出しがh3からだったのでデザインが微妙になり、h1タグを手打ちした。ちょっとめんどくさい。
ブログデザイン含め、どうしたらいいか検討中。

butter sugar cream


tomggg - butter sugar cream
はにほへと でけ バターシュガークリームの国
ふにゃふにゃかき混ぜて
いっちょ上がり

fucc U

9ヶ月ぶりに髪を切ったこと

しばらく髪を切るモチベーションがなく、職場でも特に指摘されないため長い間放置してきた。
次第にはヘアゴムで縛らないと制御できなくなってしまった。
流石にもう切ろうと思い、昨日美容院に行った。

美容師のセレクト

感性がfitする美容師を見つけるのは難しい。
選択するのもされるのも人間なので、お互いに感性が動的に変化していく。
自分は局所探索法で美容師を選ぶ。 アウトプットの評価が自分の基準値を越える人を発見すると、ずっと同じ人を選択していく。
以下、選定候補が全くいない状態を初期値とし、選定するときの自分の判断基準を示す

1. 自分が通える距離の近さを優先基準にし、ランダムで美容院を選択
2. 美容師の選択は美容院側に任せる
3. 服装、髪型のセンスを評価
    * 特に気にならない→予約を続行
    * 明らかにダサい →可能ならキャンセル
4. 自分がなりたい髪型に最も近似している芸能人の画像をスマホで見せる。  
   美容師が納得いくまで様々な角度の画像を見せ、美容師側からの質問にも自分の想像に近似した画像を見せて答える
5. 切ってもらってる間適当に話をしたり、精神を無にしたりする
6. 髪を切り終えるまでの工程を定性的に評価(サンプル)
    * 鏡で仕上がりを見たとき
         * 嬉しい +50
         * まあこんなものか +30
         * 死にたい -50
    * 仕掛けてくる雑談の質を評価
        * 面白い場合 +10
        * 特にストレスにならない、もしくは話したくないという要求を快く呑んでくれる +5
        * 無言 0
        * 話がつまらなく、ストレスを感じる。話したくないという要求すら断りにくい雰囲気 -10
    * 眉カットも可能(追加料金可) +10
    * カット料金
         * ~ 3500円 +5
         * 3501円 ~ 4500円 0
         * 4501円 ~ 6000円 -10
         * それ以上 -50
7. スコア別に美容師の選択基準を更新
    * マイナス評価 →探索から除外
    * 0 ~ 50 →最終選択候補に入れつつ、髪が伸びたら①の手順に戻る
    * 51 ~ →継続して指名

スコアが51を越えた後も、もっといい美容師がいる可能性は?

人生の中で髪を切る回数はあまり多くないので、一定水準を越えた美容師が現れた後も探索を続けるのはとてもリスキーに感じる。
最終的な目的は自己肯定感の向上なので、最も良いスコアを目指すより最小限のコストで探索作業そのものを終わらせたい気持ちでやっている。

自分の無意識下で作成しているアルゴリズムを掘り起こして明文化する

個々人の頭の中に明文化されてない複雑なアルゴリズムが実装されている。
上のアルゴリズムも頭の中で対話しながら掘り起こしたので、スコアも手順もフィーリングで言ってるだけなのだけど、明文化されて洗練されていくことでもっと汎化できるんじゃないかな。
ユーザにとって初めての美容師を選ぶのはとても怖いことだし、多分美容師の方々も感性の合致する客を常連客に付けたいと考えているはずで、これらの作業を自動化して探索コストを削減できれば、美容師とユーザの有意義な関係がもっと生まれると思う。

Fucc U

スマホのカメラをいきなり向けられるのが苦手なんです。  
撮られたときに変な顔してたり、
気持ち悪い自分が写ってるのが嫌です。  

といつも切ってもらってる美容師の人に話したら、

「へえ、自分は自分の好きな格好してるので
他人にどう思われるかとか気にしたことないです。  
自分が良いと思ったら他の人のこととかどうでもいいし、
自分のセンスの方が絶対洗練されているので」

と返された。
ぐうの音も出なかった。


Lick-G - Fucc U (visual)

motherfuccer
それだけmotherfuccer
それだけmotherfuccer
それだけmotherfuccer

Next Episode part2

ブログ再開

  • 理由
    • 積極的にアウトプットしたい
    • 若干多動性があり自分自身何やってるかわからなくなるので、ブログ書きながらPDCAを回す
  • 方針
    • エンジニアリングに軸足を置きつつドメインは特定しない
      • 拘りすぎると人真似になりがちなので、発信することそのものに重きを置く
    • 何らかの形で飯の種に繋がるようにしたい
    • 辛いこと、楽しめないことは書かない

一年間何してたか

  • 2017年6月 ~ 9月
    • 前職を退職しニート
    • connpassを通じて勉強会に複数参加
    • 現職場でバイト→正社員に
  • 2017年10月 ~ 2018年2月
    • 仕事を複数案件引き受ける
    • 勉強会で発表者に登録する
    • アドベントカレンダー2つ書いた
    • 疲れてダウンし休暇をもらう
    • 職場に復帰した直後インフルエンザにかかって倒れた
  • 2018年3月 ~
    • 職場復帰、しんどくならないよう今の所仕事量セーブしてる
    • 自主的な時間が取れるようになったのでいろいろ始める

この一年でやったこと

  • 自然言語処理案件
  • 音声対話システムUI/UXの実験計画
  • node.jsで対話システム用API作った
  • 自社論文読み会で二回発表、少し運営
  • はじパタの勉強会でSVMについて発表
  • 3月より勉強中

やろうと思っててできなかったこと

  • 強化学習関連の実装
  • 競技系
  • 自然言語処理100本ノック
  • 自己管理
    • 一番大事
  • 髪切る
    • もう10ヶ月くらい切ってない

タイトル

MOL53/ Next Episode Pt'2
www.youtube.com

命ある限りどこでも生きれる
別に俺はそうだと言い切れる
名前つけて保存したファイルを量産したようなタイトル
そんな緩さとかっこよさが共存する曲

Gunosyデータマイニング研究会で発表したよ

発表資料

課題図書

これからの強化学習

これからの強化学習

  • 作者: 牧野貴樹,澁谷長史,白川真一,浅田稔,麻生英樹,荒井幸代,飯間等,伊藤真,大倉和博,黒江康明,杉本徳和,坪井祐太,銅谷賢治,前田新一,松井藤五郎,南泰浩,宮崎和光,目黒豊美,森村哲郎,森本淳,保田俊行,吉本潤一郎
  • 出版社/メーカー: 森北出版
  • 発売日: 2016/10/27
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る

発表までに読んだ本

参照した論文

Playing Atari with Deep Reinforcement Learning

Human-level control through deep reinforcement learning

Mastering the Game of Go with Deep Neural Networks and Tree Search

感想

該当箇所を読んで資料にまとめるまでの一連の流れで、超真剣に勉強するので力になる。発表でgdってしまったけど、主催者や参加者のみなさんに大いに助けをいただいて、最後まで完走できた。詰まったら怒られるかなと思っていたら、みんな優しくてよかった。でも、詰まるのはよくないね。

反省と今後

主に数式やアルゴリズムで理解が不十分だったところは解説できなくて詰んでしまい、自分がそれらに対していい加減な理解しかしていないという事実に気づいた。

数学書を読み、手を動かして演習するなどして、ちゃんと数学に向き合ってこなかったことは、統計学機械学習を始め様々な技術を学ぶ上でボトルネックになると思った。

アルゴリズムに対しても同様に、手を動かして実装することをしていかないとといった気持ち。全体的にアウトプット不足なのを解消しないといかん。

そういった基礎部分に重きを置いて修行します。
今年中にまた発表にチャレンジしたいです。

Q-Learning学習器を作って強化学習を理解したい

注意

勉強中のためあまり正確ではありませんのでご容赦ください。

この記事の目的

  • 『これからの強化学習』1.1 ~ 1.3までを勉強
  • Q-Learningを実装したい

用語

行動する主体・・・エージェント(agent)
はたらきかけられる対象・・・環境(enviroment)
エージェントが環境に行う働きかけ・・・行動(action)
エージェントが行動することで変化する環境の要素・・・状態(state)
エージェントの行動の結果与えられる指標・・・報酬(reward)
エージェントが行動を決定するためのルール・・・方策(policy)
エージェントの一連の行動の後、最終的に得られる報酬全てを含めた結果・・・収益(return)

強化学習って?

対象について不完全な知識しかなく、対象への働きかけによって観測できることが変わってくる場合において、試行錯誤を繰り返しながら最適な行動を学習することで問題を解く理論のこと。 したがって、最適な行動=最も良い方策(最適方策)を探し当てることが強化学習の目的となる。

最適方策ってどうやって決めるの?

最適方策を決めるためには、方策を比較できるようにしなければならない。そこで、 { \displaystyle
} \begin{align*} Q^\pi(s, a) = \mathbb{E}^\pi [G_{t+1} \mid S_t = s, A_t = a ] \end{align*}

の値を状態 s及び行動 a行動価値とよび、 Q^\pi(s, a)行動価値関数とよぶ。 \piは方策、Gは収益を表す。最適方策のもとでの行動価値関数を、 { \displaystyle
} \begin{align*} Q^*(s, a) = \max_\pi Q^\pi (s, a) \end{align*}

とし、これを最適行動価値関数とよぶ。方策の良さを評価するためには、その方策のもとでの価値関数を求めることが必要となる。

価値関数を求めるための手法

具体的に価値関数を求めるためには、現在の状態と行動についての価値と、一時刻後の状態についての価値のあいだの関係を利用して現在の状態・行動についての価値を逐次更新していく必要がある。

  • Sarsa
    事前に定められたある方策 \piのもとでの行動価値関数を学習する手法。

  • Q-Learning 最適行動価値関数、すなわちエージェントがすべての場所で理想的な行動をした場合の方策を推定する手法。

具体的なアルゴリズムはこちらが詳しい yamaimo.hatenablog.jp

Q-Learningを試す

コードはこちらのブログを大いに参照しました

www.jonki.net

例題:無人島(『これからの機械学習』pp32のケースを引用)

この環境の状態集合の要素は,  s_1:寝起きしている洞窟,  s_2:遠回り,  s_3:近道(岩場),  s_4:水場となる. 行動集合の要素は, a_1:近道の経路を進む行動, a_2:遠回りの経路を進む行動, となる. 近道経路( s_3経由)で水場に到着すれば最も良い(報酬5を得る)が, ここは岩場であり, 間違った行動( a_2)をとると怪我をする(報酬-100を得る). 遠回り経路( s_2)経由では歩きやすく( s_2に着いた時点で報酬1を得る), 間違った行動(この場合はa_1)をとっても大きな問題にはならない(報酬-1を得る)が、水場に到着したときの良さは少し(報酬1を得る)である.

コード

import numpy as np
import random

# 報酬行列
R = np.array([
    [0, 1],
    [-1, 1],
    [5, -100],
    [0, 0]
    ])

# Q値
Q = np.zeros((4, 2))

# 割引率
Gamma = 0.8

# 初期状態
state = 0

# エピソード
episode = 1

# 状態遷移関数
def shiftState(state, action):
    if state is 0:
        if action == 0:
            return 2
        return 1
    elif state is 1:
        if action == 0:
            return 0
        return 3
    elif state is 2:
        if action == 0:
            return 3
        return 0
    else:
        return

# t+1のアクションのうち最大のQ値を取得
def fetchMaxQvalueOfNextState(next_state, action_menu):
    return max([Q[next_state][i] for i in action_menu])

# Q学習
def learnQ(R, Q, Gamma, state, episode):
    
    while episode <= 10:
        print("episode is %d" %episode)
        print("state is %d" % state)
        action_menu = [0, 1]
        action = random.choice(action_menu)
        print("action is %d" %action)
        next_state = shiftState(state, action)
        print("next state is %d" %next_state)
        max_Q_next_sa = fetchMaxQvalueOfNextState(next_state, action_menu)
        Q[state, action] = R[state, action] + Gamma * max_Q_next_sa

        print(Q)

        state = next_state

        if next_state is 3:
            episode = episode + 1
            if episode is 11:
                print("Finish!!")
                print(Q)
            else:
                print("next episode is %d" %episode)
            state = 0
            
if __name__ == "__main__":
    learnQ(R, Q, Gamma, state, episode)
    Q

実行してみた結果

[[  4.     2.76]
 [  2.2    1.  ]
 [  5.   -96.8 ]
 [  0.     0.  ]]

こんな行列になって収束した。  s_1a_1 s_3 a_1の値が高いので、これを頼りにエージェントを走らせれば一応最適解になるっぽい。

感想

報酬行列の値を変えていろいろ試すと最適解が変化していって面白い(小学生)
実際にエージェントを走らせてみないとどうにも結果がわからんですね。
次回はもうちょっと複雑なケースを実装して走らせてみようかと思います。
サンキュー

Rで売上ランキングをカラフルに可視化

この記事の目的

  • k-meansを用いて売上データ(擬似データ)をヘビー・ミドル・ライトに分類
  • ggplot2を用いてプロット
  • 技術系の記事初めて書くので、練習のため

パレートの法則

ソーシャルゲームの売上の8割は全ユーザーの2割のヘビーユーザーの課金によるものである」みたいな話のように、全体の数値の大部分が、全体を構成する要素の一部によって賄われている現象のこと。この考え方に従って、課金額がミドルやライトなユーザーをヘビーに変えるための導線を探すことがマーケティング戦略上重要になる。

前準備

対数正規分布を用いて擬似データを作成

sales <- rlnorm(10000, meanlog = 10, sdlog = 1)
dataFrame <- as.data.frame(sales)

k-meansクラスタリング

library(ykmeans)

yk_data <- ykmeans(dataFrame,
                   k = 9,
                   variable.names  = "sales",
                   target.name = "sales",
                   cluster.name = "cluster",
                   n = 100)

少し加工してggplot

library(dplyr)
library(ggplot2)
library(scales)

yk_data <- yk_data %>% 
  arrange(desc(sales)) %>% 
  mutate(cluster = factor(cluster)) %>% 
  mutate(row = row_number())

ggplot(yk_data, aes(x = row, y = sales, group = cluster, colour = cluster)) +
  geom_point() +
  scale_y_continuous() +
  xlab("売上ランク") +
  ylab("売上額") +
  scale_y_continuous(label = comma) +
  theme_bw(base_family = "Osaka")

結果

f:id:hasewo_gamer:20170515031905p:plain

ちょうど曲がってるあたりがヘビーとミドルの境目くらいかなあ
3~5に分類されたユーザーと6~9に分類されたユーザーの行動比較みたいなのをやりたいけど、擬似データなのでここまで

感想

ggplotの書き方すぐ忘れるので備忘録がてら描いてみました
コード載っけてみたけど見にくいので、はっきり見える方法わかったら修正します
サンキュー