Qstairs

現役AIベンチャーCTOの知見、画像認識(人工知能、Deep Learning)を中心とした技術ノウハウをアップしていきます

広告

【ITエンジニアの実情】フリーランスを1か月経験して感じた会社による働き方の違い

f:id:qstairs:20170209000813j:plain

はじめに

3/31で4年間勤めた会社を退職し、
4月からITエンジニアのフリーランスとして働いて1か月がたちました。

私がエージェントに 仕事を探してもらう際に提示した条件は
とにかく残業が少ない職場で!
というものでした。

この条件で仕事を探してもらい、
今の現場の面談を受けた際には
稼働は安定している=残業はほぼない
と聞いていました。
とはいえ、
実際は20時間ぐらいは残業することになるだろうと考えていました。

では、4月も終わったので結果を発表します。
残業時間はなんと、
0時間
でした。
驚くことに毎日18時前には退社するという素晴らしい日々を送っています。

また、仕事内容はと言いますと、
1つの作業を余裕のある納期で進めるという
前の会社ではありえない状況に困惑しています。
#もちろん、入って間もないため納期に余裕を持たせてもらっていますが。

ちなみに、前の会社では3~6の案件を並列に進めていき、
中には短納期なものもありました。

なんで同じIT業界で働き方に差が出てしまうのでしょうか。

私が思うに、以下3点が理由として挙げられるのではないでしょうか。

  1. 扱う技術の違い
  2. 顧客を固定できるか
  3. 顧客が業界トップシェアか

では、それぞれに関して以下に記載していきます。



扱う技術の違い

働き方に差が出る理由の1つ目としては、
扱う技術が全く異なることが原因ではないかと思います。
つまり、世間に定着した技術か未知の技術かということです。

前の会社では、最先端の技術を使用した案件がほとんどでした。
最先端の技術は顧客も「相場」が分からないため、
どうしても低く見積もられます。
また、先陣切って最先端の技術を使いたいと言ってくれる顧客は少なく、
こちらとしては何とかして受注したい、実績を残したいという思いがあるため、
比較的少額で短納期でも受けざる負えない場合もあります。

一方、定着した技術は、
基本的にある程度の市場規模が確立されているため、
(だからと言って儲かるというわけではない)
顧客もその技術の「相場」を(調べれば) 理解でき、
双方納得した上で受注しやすくなります。

つまり、扱う技術によって、
顧客と受託側のパワーバランスが変わることで働き方に差が出ているのではないでしょうか。

顧客を固定できるか

働き方に差が出る理由の2つ目としては、
顧客を固定できるかという点です。

顧客が固定されるとどうなるか、
顧客にとっても受託側にとっても互いを切り離せない関係になります。
つまり、信頼関係が生まれます。

するとどうなるか、
顧客もある程度のことであれば受託側の意見を聞き入れるようになります。
よって、開発内容に関しても、納期に関しても受託側には余裕を持たせることができます。

ただ、顧客を固定すると様々な問題がありますが...

顧客が業界トップシェアか

働き方に差が出る理由の最後としては、
顧客が業界でトップシェアかという点です。

顧客が業界でトップシェアだと何が良いのかというと、
簡単に言えば、お金を持っている(可能性が高い)ということです。

顧客がお金を持っていると、買い叩かれる可能性が減ります。



最後に

いかがでしょうか。
正社員として4年間、フリーランスとして1か月働いた中で感じた、
会社(職場)による働き方の違いの原因についてまとめました。

ただ、個人的な肌間隔によるもので、
定量的な数値を使用しているわけではありません。
なので、( ´_ゝ`)フーンという感じで受け取っていただければと思います。



「一人でも多くのITエンジニアに幸せになってほしい。」

そう願う限りです。

【Deep Learning】NNの重みの傾向(差分とヒストグラム)

f:id:qstairs:20160601221351j:plain

はじめに

前にNNの重みに関する見解を書きました。
そこでは、以下のようにまとめていました。

学習による割り当てられる重みの初期値の差異は大きく、
繰り返し学習による重みの変化は小さいことが分かった。

これらから、NNモデルの学習では重みの初期値が重要になることが分かる。

今回は、MNISTを使用し、
重みの初期値と学習終了時の差分
学習終了時の重みのヒストグラムを求めて
NNの重みの傾向を探っていきます!


qstairs.hatenablog.com

学習モデル

今回はMNISTを使用し、以下のモデルで学習しました。
#MNISTの取得方法はこちら

self.model = FunctionSet(
      l1 = L.Linear(784,1000),
      l2 = L.Linear(1000,1000),
      l3 = L.Linear(1000,10),
)

重み(l1)の傾向

初期値と学習終了時の重みの最大差分(絶対値)

最大差分 ⇒ 0.0065

学習終了時の重みのヒストグラム


重み(l2)の傾向

初期値と学習終了時の重みの最大差分(絶対値)

最大差分 ⇒ 0.0041

学習終了時の重みのヒストグラム

重み(l3)の傾向

初期値と学習終了時の重みの最大差分(絶対値)

最大差分 ⇒ 0.0246

学習終了時の重みのヒストグラム

まとめ

今回はMNISTによるNNの重みについて調査しました。
結果として、重み(l3)が最も初期値から学習終了までに変化する量が多くなりました。
これは、l3は1000次元から10次元に大きく減少している、
かつ、誤差量の影響が大きいためでしょうか。

また、重みのヒストグラムを見るとどれも同じような傾向になりました。
重み0に近くなるにつれて割合が多くなるのは興味深いですね。


【Deep Learning】fetch_mldataでmnistのデータを取得できない場合の対処(Chainerの場合)

f:id:qstairs:20160601221351j:plain

はじめに

mnistを使った実験を行いたい場合、
これまでは「fetch_mldata」でmnistのデータを取得していましたが、
どうやら取得できなくなっている模様です。
#Irisは取得できています。

そこで、fetch_mldataではなく
Chainerにあるmnistを取得する関数を使おうとしました。

ところが、データ形式がfetch_mldataとは異なっていて困った。
なんとかfetch_mldataの形式に合わせる処理を作ったので紹介します。

fetch_mldataの場合

mnist = fetch_mldata('MNIST original', data_home=".")
# mnist.data : 70,000件の28x28=784次元ベクトルデータ
mnist.data = mnist.data.astype(np.float32)
mnist.data /= 255  # 正規化

# mnist.target : 正解データ
mnist.target = mnist.target.astype(np.int32)

# 学習用データN個,検証用データを残りの個数に設定
N = 60000
xtrain, xtest = np.split(mnist.data,      [N])
ytrain, yans = np.split(mnist.target,    [N])

Chainerでmnistを取得しfetch_mldataの形式に変換

各変数がfetch_mldataと対応しています。

train, test = chainer.datasets.get_mnist()
train = np.array(train)
test = np.array(test)
xtrain = []
ytrain = []
for data, label in train:
    xtrain.append(data)
    label_list = np.zeros(10)
    label_list[label] = 1.0
    ytrain.append(label_list)
xtrain = np.array(xtrain).astype(np.float32)
ytrain = np.array(ytrain).astype(np.float32)

xtest = []
yans = []
for data, label in test:
    xtest.append(data)
    yans.append(label)
xtest = np.array(xtest).astype(np.float32)
yans = np.array(yans)


以上!

【人工知能】うどん工場にもAIが!?

f:id:qstairs:20170424211556j:plain

製麺業の川田製麺(高松市、川田明義社長)は、高松東ファクトリーパーク内の自社工場(さぬき市)に人工知能(AI)機能を搭載した検知器やIoT(モノのインターネット)技術を今秋に導入する。


うどん工場に人工知能 川田製麺 不良品検知、学習で進化 今秋導入 | うどん関連ニュース | 讃岐うどん遍路 | 四国新聞社


X線の画像を使用して包装の不良品を検知するとのこと。

気になるのは、検知精度ですね。

X線の画像なので、可視光に比べると検知しやすいとは思いますが、
果たしてどれほどの精度があるのでしょうか?

また、記事の中に、

使用回数が増えるごとに“進化”して検知の精度が向上する

とありますが、どうやって進化するのでしょうか。

導入している人工知能の出力をそのまま使用している場合、
人工知能が一度間違った出力してしまうと真実とは間違った方向にどんどんずれていくように思うのですが。
#正解を人が教えている?

どういうアルゴリズムなのか気になりますね。

【IT】コンビニの全商品に電子タグが!

f:id:qstairs:20170418201055j:plain

経産省は「コンビニ電子タグ1000億枚宣言」を策定。2025年までに、コンビニ大手5社の全商品、年間約1000億個に電子タグを取り付けるという。


www.itmedia.co.jp


この電子タグは購入した後も商品に取り付けたままなのでしょうか?


仮にそうだった場合、
今のところ消費者が商品を買ったあとでも
この電子タグを使用してさらに面白いことができそうですね!


例えば、ごみ箱でこの電子タグの読み取ることで、
商品の実際の消費地域が見える化され、商品開発や出店場所の選定に活かされます。
#ちょっと無理矢理ですね(^_^;

他にはスマホで読み取って摂取カロリーの計算とか。
#これは良さそうですね!

新しいビジネスが生まれそうです!

関連記事

qstairs.hatenablog.com

【Rails】Ruby on Rails始めました

f:id:qstairs:20160601221351j:plain

はじめに

現在のITサービスにおいて、
Webサービスは切っても切れないものになっています。
そんな中で事業を作っていく身としてはWebサービスはできませんでは話になりません。
ということで、Webアプリの開発が容易だという「Ruby on Rails」の勉強を始めました。

今回やったことは以下の2点になります。

  • 環境構築
  • 簡単なRailsアプリの作成

#環境はMac OSです。

環境構築

私は以下のサイトを参考にしました。
最初は他のサイトを参考にしていましたが途中うまくいかず、
以下のサイトに行き着きました。
【El Capitan】Mac OSX 10.11 El Capitan にRuby + Rails4 開発環境の構築 【初心者必見】 - Qiita

簡単なRailsアプリの作成

環境構築まで完了した後、以下のサイトを参考に簡単なRailsアプリを作成しました。
タイトルにあるように、「小学生でもわかる」ということで
どんなものかと思い選んでみたところ、
とてもわかりやすかったです。

小学生でもわかるRuby on Rails入門 | OpenBook

ただ、ITリテラシーが低い方にとってはちょっと難しいかなと思います。(^_^;
ただ、行き詰まった際には関連するサイトを探して解決していけば問題ないかと思います。

最後に

今回はRuby on Railsの環境構築と簡単なRailsアプリの作成を行いました。
感想としては、「これは便利!!」の一言です。
というのも、画面と処理とDBが同じ環境内に収まっているので、
そういった各モジュールとの連携で悩む必要がありません。

今後はスマートフォンのアプリとの連携を含めた
Webサービスの開発まで検討していこうかと考えています。

【Deep Learning】NNの重みは学習の度に異なり、初期値から大きく変化しない

f:id:qstairs:20160601221351j:plain

はじめに

NNを学習する際に
まずは各重みに初期値が割り当てられる。

そして、NNの学習はこの初期値の重みを変えながら進んでいくことになる。

つまり、初期値が大事になる。

そこで、今回は

  • 初期値が学習のたびにどれだけ異なるのか
  • 繰り返し学習によってどれほど初期値が変化するのか

について評価する。

また、今回は評価するために重みを色で表現した。


例:
左の〇4つが入力層、真ん中の〇6つが中間層、右の〇3つが出力層となっている。
重みは各〇をつないでいる線の色で表す。
より赤ければ重みが大きく、黒ければ小さい。


f:id:qstairs:20170412214241p:plain

実験内容

この前の記事に書いたIris(アヤメ)の識別に構築した学習モデルを使用し、
繰り返し学習回数(epoch)を5,000で4回学習した。

各学習で得られた重みを色で表現した画像を出力した。

初期値が学習のたびにどれだけ異なるのか

下の画像が各学習での初期値になる。
ぱっと見はわかりにくいが、よく見ると結構異なっている。


f:id:qstairs:20170412215324p:plain

繰り返し学習によってどれほど初期値が変化するのか

以下に初期値と繰り返し学習回数を5,000回行ったときの画像を列挙した。
大きな変化がないことが分かる。

学習①
f:id:qstairs:20170412215947p:plain:h300
学習②
f:id:qstairs:20170412215959p:plain:h300
学習③
f:id:qstairs:20170412220008p:plain:h300
学習④
f:id:qstairs:20170412220019p:plain:h300


学習①の重みの移り変わりの動画
youtu.be


まとめ

今回は学習するNNモデルの重みについて、について、
学習による割り当てられる重みの初期値の差異と
繰り返し学習による重み変化を評価した。

結果として、
学習による割り当てられる重みの初期値の差異は大きく、
繰り返し学習による重みの変化は小さいことが分かった。

これらから、NNモデルの学習では重みの初期値が重要になることが分かる。

よって、
構築した学習モデルの評価を行う際は、
構築した学習モデルに対して学習を複数回行い、
各学習モデルの平均等を出すべきである。


注意事項

今回の評価ではDeep LearningのフレームワークであるChainerを使用しており、
他のフレームワークでは同様の結果が出ない可能性があります。

関連記事

qstairs.hatenablog.com

広告