コンビニでもどんどんロカボが進化中!

ダイエットやメタボ対策の定番になった“緩やかな糖質制限”ロカボ。このロカボを提唱したのが糖尿病専門医の山田悟さんです。本連載では、「食べる喜びをしっかり味わいながら健康になる」ことが何よりも大事、と話す山田さんが、ロカボについて医学的根拠から説き起こし、わかりやすく伝えていきます。今回のテーマは「コンビニ&スイーツ」。最近、コンビニエンスストアの商品は急速に進化しており、以前よりはるかにロカボを実践しやすくなっています。

Demystifying the GPU

If you’re involved with Machine Learning, or happen to be a NVidia investor, you must have heard that GPUs are critical to the field. But for me, GPUs have always been a bit of a mystery. I had a pretty high level understanding of GPU == fast in my head, but not much more than that.

And honestly, that gets you pretty far. I started doing hands on ML work with Keras, which is an API on top of Google’s TensorFlow library. Keras is a beautifully designed API that’s made the very practical decision that most things should be simple, and hard things should be possible.

Because of this, I didn’t really need to learn anything about the GPU. I just ran a few magic OS commands and a couple magic lines of code and — boom! — massive model training speedup achieved. And I was perfectly happy with this situation.

However, on our latest project here at feedly, we’ve decided to try PyTorch, basically because it’s been getting buzzier and buzzier. But there’s been some good data points in it’s favor. The new (highly recommended) fast.ai course sequence switched from Keras to PyTorch. Lots of recent Kaggle competitions have also been won by PyTorch models.

So we dug in and found that PyTorch makes all things possible through clear and consistent APIs. It’s more flexible than Keras, so the trade-off is that easy things get a bit harder but hard things get a bit easier. If you’re experimenting with new or unusual types of models (or you happen to be a control freak), PyTorch is definitely a better fit.

When the time came to GPU accelerate my PyTorch model and I googled for the magic GPU -> on line of code, I found out it didn’t exist! True to form, Pytorch makes this a bit harder than Keras, but provides APIs on how you should go about doing things. The upshot of all this is that I had to bite the bullet and actually build a mental model of how the GPU is actually being used to speed up model training.

Why GPUs are Fast

Models generally have many, many parameters. For example, the popular VGG image classification model has about 140 million parameters divided over 16 layers! When running inference (predictions), you need to pass your input data (image) through each layer, usually multiplying that data by the layer parameters. During training, you have to also tweak each parameter a little bit to better fit the data. That’s a lot of arithmetic!

CPUs are good at doing a few things really fast. This is usually fine, there is enough branching (if a user does this, do that), and other sequential constraints that massive parallelism isn’t really possible. GPUs are good a doing a lot of things “slow”. Since they were originally used to do graphics requirements, they expect do a bunch of stuff at once (think converting all the pixels of an image to grayscale). So there’s a tradeoff here, and for ML the GPU wins big time due to the fact that these huge arithmetic operations that can be done in parallel.

To make things concrete, my macbook has a CPU that runs at 3.1Ghz and has 4 cores. A NVidia K80 GPU has almost 5000 cores, albeit running at a much slower 562Mhz. Although this is not really a fair thing to do, you can see that the K80 has a clock speed that is about 6 times slower, but is 1250 times more parallel.

How to Think About GPUs

Instead of the GPU -> on line of code, PyTorch has “CUDA” tensors. CUDA is a library used to do things on GPUs. Essentially, PyTorch requires you to declare what you want to place on the GPU and then you can do operations as usual. So I thought, let’s try placing a layer on the GPU:

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.hidden = nn.Linear(784, 50)
        self.final = nn.Linear(50, 10)

    def forward(self, features):
        x = self.hidden(features.float().view(len(features), -1))
        x = self.final(x)
        return F.log_softmax(x, dim=1)
...
    model = Model()
    model.hidden.cuda()
    model.forward(batch)

I ran the code and immediately got an error at the hidden layer calculation:

Expected object of type Variable[torch.cuda.FloatTensor] but found type Variable[torch.FloatTensor] for argument #1 'mat1'

Why? I knew immediately it had something to do with the .cuda() bit of code I added but I wasn’t sure why. After a bit of thinking about how GPUs are supposed to speed things up, I realized, “Of course it doesn’t work, one tensor is on the GPU and another is still in main memory!”. Everything kind of snapped in place. Pytorch allows you to allocate tensors in GPU memory and then do operations on those tensors utilizing the GPU. But where do the results of those operations go? Let’s try another example:

t1 = torch.cuda.FloatTensor(20,20)
t2 = torch.cuda.FloatTensor(20,20)
t3 = t1.matmul(t2)
print(type(t3))

<class 'torch.cuda.FloatTensor'>

It’s another tensor in GPU memory! After more trial and error I found I had to change my way of thinking. Originally I thought of Memory, CPU, and the GPU all jumbled together:

What I realized is that it I needed to think of things like this:

 

Essentially the CPU/main memory and GPU/GPU memory each live in their own little universes. Coming from a software engineering background, I started to think of GPU operations as a REST API. When you’re using a REST API, the real cost is sending the data back and forth. Doing stuff locally is fast (or is as fast as it can be) as is stuff done on a remote server. But what you want to avoid is a lot of data shipping back and forth as that is pure overhead.

So carrying that analogy forward, we can see that of course it makes sense that the PyTorch matmul result is a GPU tensor. That would make it easy to do further manipulations on the GPU without shipping the data to main memory and then back to the GPU again. So if we want to use the GPU, we really want all of our parameters on the GPU as those will be used over and over again to produce predictions in the forward pass and then updated in the backward pass. Each batch of features will have to be shipped into GPU memory. But then the intermediate and final results (e.g. the output of the hidden layer) can just live in GPU memory. All we need to do is keep sending commands to the GPU to tell it how to manipulate the parameters and weights.

So in the API analogy, we just make two “heavy” requests (starred in the drawing above), one to initialize the weights and one to get the final weights after training. But we make potentially millions of  lightweight requests in between those 2 to train the model.

GPU Performance Gains are Real and they are Spectacular

So what kind of speedup is possible? PyTorch has a nice little MNIST example we can use. Running this for 10 epochs took 153 seconds using the CPU only and 83 seconds using the GPU. And we could theorize that larger models could experience even bigger gains. Not bad, not bad at all.

Some Experiments

This was all great. After a little thinking and some terrible drawings, I understood GPUs much better and the extra coding required is not bad at all. But was my thinking correct? The best way to answer this question was to build an experiment. I wanted to prove to myself that shipping data is the “slow part” of the workflow. So I tried the following 3 things:

  1. Do a 200x200 matrix multiply in numpy, a highly optimized CPU linear algebra library.
  2. Do a 200x200 matrix multiply on the GPU using PyTorch cuda tensors.
  3. Do a 200x200 matrix multiply on the GPU using PyTorch cuda tensors, copying the data back and forth every time.

As expected the GPU only operations were faster, this time by about 6x. Interestingly, 1. and 3. took almost exactly the same amount of time. The efficiency of the GPU operations was balanced almost exactly by the inefficiency of the data shipping!

If you enjoyed reading this, subscribe in Feedly to never miss another post.

身近な人に「死にたい」と言われたとき、できること

日本自殺予防学会理事長で、帝京大学医学部附属溝口病院精神神経科教授の張賢徳さんに、日本で自殺予防対策の取り組みが進められてきた背景や、身近な人が「死にたい」と言葉にしたとき、それを防ぐ「ゲートキーパー」の役割を果たすための心得「TALKの原則」について聞いた。

認知症の親をみとった…子供にも同じ苦労を?

親の面倒を見終えた人達に考えてほしいのは、自分や伴侶の認知症対策だ。いざ認知症になってしまうと、自分で判断することが難しくなる。自分が認知症になったとき、どのような介護を受けたいのか、70代の始めには、しっかり考えておきたい。

【みぞおちが痛い】酒をたくさん飲む人は急性膵炎にもご用心!

飲み過ぎたとき、食べ過ぎたとき、ストレスを感じたとき、みぞおちがキリキリと痛むことがある。ありふれた症状の一つだが、ときに死に至る病気の予兆が潜んでいることがあるという。では、どのような症状のとき、救急車を呼ぶなど命を守る行動をとったらいいのか、専門家のアドバイスをまとめた。

初期老眼から知っておきたいサプリ&メガネ・コンタクトレンズ選び

疲れ目とともに頭痛や肩こりに悩まされる眼精疲労は、目のピント調節力が低下したサイン。背景にあるのは、加齢とともに明らかになってくる“初期老眼”や“かくれ遠視”だ。今ある不調を改善するなら抗酸化サプリ、目の負担を根本からとるならメガネやコンタクトレンズが効く。さっそく試してみよう。

@adidasfun

スペインでは、フットサルは「フットボル・サラ」と呼ばれており、スペイン代表チームは2000年・2004年のFIFAフットサルワールドカップ、2005年のヨーロッパ選手権などで優勝した。 #フットサル #サッカー #ユニフォーム

石原良純流・トレイルランの楽しみ方

テレビ界きっての多趣味人で、博識の石原良純さん。50代で人生により磨きをかける日々の中で感じている、カラダのこと、天気のこと、そしてニッポンのこと。何事も前向きに生きれば、日々是好転! 今年の春は例年より早く桜が開花しました。春先の今の時期は、石原さんにとって「トレイルラン」の季節。ロケ先の伊豆・城ヶ崎でさっそく暴走しました。そんな石原さんが、トレイルランの魅力を語ります。

IWA柴山潟一周ウオーク開催!

181325iwa-2

IWA柴山潟一周ウオーク開催!

3月25日(日)石川県ウオーキング協会は柴山潟湖畔公園発着でかがウオーキングクラブ歩歩と共催「柴山潟一周ウオーク」を165名の参加者で開催した。
今回はかがウオーキングクラブ歩歩の200回例会を記念し企画したもので、コース企画をはじめ駐車場の誘導などかがウオーキングクラブ歩歩の皆さんにはお世話になりました。

■写真はあいさつする大路会長

181325iwa-1

開会式では大路孝之石川県ウオーキング協会会長、岡谷吉雄かがウオーキングクラブ歩歩代表があいさつし、松林知一専務理事がコースの説明、竿下るり子さんの指導でストレッチを行い、9時過ぎに雪の科学館前をスタートした。

■写真はあいさつする岡谷代表

180325iwa-4

□斎藤実盛の首洗池
寿永2年(1183)倶利伽羅の戦いで敗走した平家軍と木曽義仲の軍が戦った源平の篠原古戦場にある斎藤実盛の首を洗ったとされる、小さな池。

180325iwa-6

□芭蕉句碑
この様子を元禄2年(1689)の奥の細道で訪れた松尾芭蕉は「むざんやな甲の下のきりぎりす」と詠んだ。
■写真は首洗池の参加者と芭蕉句碑
斎藤実盛の首洗池で休憩し、ショートコース(8キロ)と別れショートコースは柴山潟を一周。ロングコースは実盛塚経由、実盛塚駐車場で休憩。源平橋から柴山潟遊歩道をウオークし、ダイヤモンド片山津温泉ソサエティで休憩。片山津温泉街経由愛染寺にお参りし片山津検番、浮御堂で休憩し、12時半ごろ雪の科学館前にゴールした。

180325iwa-7

■写真は実盛塚の参加者

180325iwa-9

■写真は柴山潟遊歩道の参加者

180325iwa-12-400

180325iwa-13

■写真は愛染寺の参加者

180325iwa-11
■写真は浮御堂

春の訪れのた好天のなか多くの方の参加で絶好のコンディションで楽しい例会でした。

 

 

@adidasfun

ゴールクリアランス。ゴールラインを割ったときに最後に触れた選手が攻撃側だった場合、守備側のゴールキーパーがペナルティエリアの任意の地点からボールを投げる。直接ゴールに入れても得点とはならない。 #フットサル #サッカー #ユニフォーム

夜型生活の新社会人は週末の朝寝坊に要注意

新社会人の中には、朝寝坊など「睡眠」に関して不安を感じている人も少なくないだろう。週休2日制で休めるのはありがたいことだが、一方で「ソーシャル・ジェットラグ」(社会的時差ボケ)になってしまう人も増えているという。

医師が語る、3月に自殺者が増えるのはなぜ?

3月は例年、月別自殺者数が最も多くなることから、厚生労働省は「自殺対策強化月間」と定めている。3月に自殺者が増えるのはなぜか。人はどんなときに自殺を考えるのか。身近な人が「死にたい」と言葉にしたとき、私たちはどのように対応すればいいのか。日本自殺予防学会理事長で、帝京大学医学部附属溝口病院精神神経科教授の張賢徳さんにお話を伺った。

心不全、チームで患者支援 退院後まで継続的に指導

高血圧や心臓の病気で心臓のポンプ機能が低下して、血液を全身に送り出せなくなる「心不全」が人口の高齢化に伴って増えている。現在、国内の患者数は約120万人に達し、2030年には130万人になる推計もある。運動療法や食事療法など生活習慣の改善で入院を予防するため、多職種のチームで患者を支える試みが始まっている。

頻尿、尿漏れ、尿が出にくい…増える尿トラブルの正体は?

トイレの回数が多い、尿が我慢できずもれてしまう、なんとなく出が悪い…。40代以降に増えてくる尿トラブルは、日常生活にさまざまな不便を生じさせ、メンタルにも影響する。本特集では、40代以降の男女が悩む「頻尿」「尿漏れ(尿失禁)」の原因と特徴、自力で治す「骨盤底筋のトレーニング(尿失禁体操)」など、セルフケアのコツを紹介する。

健康にはゴルフと読書。趣味も「マンダラチャート」で真剣に

様々な分野で活躍する一流人が実践する健康マネジメント術を紹介する本コラム、今月ご登場いただいたのは、元スターバックス コーヒー ジャパンCEOで、リーダーシップコンサルティング社長の岩田松雄氏。最終回はストレスマネジメントに役立っているという、ゴルフと読書の楽しみについて紹介する。

@adidasfun

コーナーキック。ゴールラインを割ったときに最後に触れた選手が守備側だった場合、ボールの出たところから近いコーナーアークから相手に邪魔されない形でキックすることができる。直接ゴールを狙ってもよい。 #フットサル #サッカー #ユニフォーム

筋肉が強くなるとき、内部で起こっていること

筋肉こそ生命活動の原動力。筋肉が活動的になれば、代謝が活性化し、無駄な脂肪が落ち、健康で元気な体になります。世の中にはいろいろな「筋肉の常識」がありますが、残念ながらすべて正しいとは限りません。本連載では、筋肉博士・石井直方先生が、筋肉やトレーニングの正しい知識をやさしく解説していきます。第2回のテーマは「筋肉が強くなるメカニズム」。筋肉が強くなる際、体の内部ではどんなことが起こっているのでしょうか。

スターバックスCEO時代もコーヒーは午後3時まで

 様々な分野で活躍する一流人が実践する健康マネジメント術を紹介する本コラム、今月はリーダーシップコンサルティング代表の岩田松雄氏にお話を伺った。第2回は「日々の良き習慣が健康を、その人自身を作る」と語る岩田氏の生活習慣を紹介する。スターバックスジャパンCEO時代も「コーヒーを飲むのは午後3時まで」をルールとしていたその理由とは?

KWA「春よ来い‼ ワクワクウオーク」開催!!

雪の残る駐車場180311-500

KWA「春よ来い‼ ワクワクウオーク」開催!!

3月11日(日)小松市ウオーキング協会は2月25日予定のだった「春よ来い‼ ワクワクウオーク」をイオンモール新小松発着、100名の参加者で開催した。

■写真は出発式の参加者雪の残る駐車場

出発します180311-500

前日の天気予報では晴だったが、肌寒いなか、寒さなんか吹き飛ばせとの気合で大くの残雪が残る駐車場にて開会式が行われ、あいさつ、ストレッチ後、9時15分に出発した。
■写真は出発式の参加者雪の残る駐車場

道の駅を出ます180311-500

写真は道の駅こまつをスタートする参加者

憩いの森管理事務所180311-500
道の駅こまつの駐車場にも残雪があり、憩いの森では多くの雪害が見られた。その後、天気予報に関わらず雨が降ってきたが、そこは用意周到な皆さん即対応し、小松市立登窯展示館を経由して全員元気にイオンモール新小松にゴールした。

コース:Aコース13キロ、Bコース9キロ

■写真は憩いの森管理事務所の参加者

雨も上がりました180311-500

■写真は小松市立登窯展示館の参加者

◇情報・写真提供:KWA村中勝二氏

 

【GEARシリーズ】ノースリーブT

【GEARシリーズ】 ギアシリーズ初の、ノースリーブT。 コンプレッションインナーとのレイヤードスタイルがオススメ。 素材:ポリエステル 100%  サイズ:S,M,L,XL,XXL カラー:BLACK,WHITE
着丈アームホール身幅
S: 71cm 26cm 47cm
M: 72cm 27cm 50cm
L: 74cm 28cm 53cm
XL: 76cm 29cm 56cm

 (約/cm)

【GEARシリーズ】エンボスポロシャツ

【GEARシリーズ】 スポーツシーンに特化したGEARライン。ディテールや機能性に拘ったデザインとオリジナルエンボス柄が特徴です。 素材:ポリエステル 100%  サイズ:S,M,L,XL,XXL カラー:BLACK
着丈袖丈身幅袖口幅
S: 69cm 22cm 47cm 16cm
M: 70cm 23cm 50cm 16.5cm
L: 72cm 24cm 53cm 17cm
XL: 74cm 25cm 56cm 17.5cm

 (約/cm)

【GEARシリーズ】パフォーマンスドットユニフォーム

【GEARシリーズ】 幾何学調のドット柄デザインが特徴。吸汗速乾、抗菌防臭、再帰反射ピスネームと拘りのあるデザインもポイント。 素材:ポリエステル 100%  サイズ:S,M,L,XL,XXL カラー:BLACK
着丈裄丈身幅袖口幅
S: 68cm 40cm 47cm 17cm
M: 69cm 41cm 50cm 17.5cm
L: 71cm 42cm 53cm 18cm
XL: 73cm 43cm 56cm 18.5cm
XXL: 74cm 44cm 59cm 19cm

 (約/cm)

【GEARシリーズ】パフォーマンスドットユニフォーム

【GEARシリーズ】 幾何学調のドット柄デザインが特徴。吸汗速乾、抗菌防臭、再帰反射ピスネームと拘りのあるデザインもポイント。 素材:ポリエステル 100%  サイズ:S,M,L,XL,XXL カラー:BLACK
着丈裄丈身幅袖口幅
S: 68cm 40cm 47cm 17cm
M: 69cm 41cm 50cm 17.5cm
L: 71cm 42cm 53cm 18cm
XL: 73cm 43cm 56cm 18.5cm
XXL: 74cm 44cm 59cm 19cm

 (約/cm)

【GEARシリーズ】パフォーマンスナンバリングユニフォーム

【GEARシリーズ】 吸汗速乾性のある生地を使用した、エンボス加工でブロック柄を表現。 抗菌防臭、再帰反射ピスネームと拘りのあるデザインもポイント。ユニフォームをベースにしたデザインが特徴。 素材:ポリエステル 100%  サイズ:S,M,L,XL,XXL カラー:BLACK
着丈裄丈身幅袖口幅
S: 68cm 40cm 47cm 17cm
M: 69cm 41cm 50cm 17.5cm
L: 71cm 42cm 53cm 18cm
XL: 73cm 43cm 56cm 18.5cm
XXL: 74cm 44cm 59cm 19cm

 (約/cm)

【GEARシリーズ】パフォーマンスナンバリングユニフォーム

【GEARシリーズ】 吸汗速乾性のある生地を使用した、エンボス加工でブロック柄を表現。 抗菌防臭、再帰反射ピスネームと拘りのあるデザインもポイント。ユニフォームをベースにしたデザインが特徴。 素材:ポリエステル 100%  サイズ:S,M,L,XL,XXL カラー:BLACK
着丈裄丈身幅袖口幅
S: 68cm 40cm 47cm 17cm
M: 69cm 41cm 50cm 17.5cm
L: 71cm 42cm 53cm 18cm
XL: 73cm 43cm 56cm 18.5cm
XXL: 74cm 44cm 59cm 19cm

 (約/cm)

@adidasfun

ドイツでは、「ハーレンフースバル」と呼ばれる壁付のインドアサッカーが、ブンデスリーガの冬の中断期に行われている。この試合には、現役のブンデスリーガの選手やかつてのスター選手が参加している。 #フットサル #サッカー #ユニフォーム

春のおでかけは足元を軽やかに* 大人な女性だからこそ取り入れたい「スニーカーコーデ」術

春のおでかけは街歩きなどでたくさん歩く事が多くなってきます。歩きやすいスニーカーでおでかけをしたいけれど、なんだかカジュアルになり過ぎて子供っぽいコーディネートになってしまう事はありませんか?今回は、落ち着いたい大人の女性に合うデザインはもちろん、カラーや素材などにもこだわったスニーカー&コーディネート術をご紹介します。お気に入りのスニーカーで素敵な春のおでかけファッションを楽しみましょう♪

【ユニセックス】ビッグシルエット L/S TEE

両サイドがスリット仕様の、ビッグシルエットロンT。ミラノロゴがインパクト大。 ビッグシルエットなのでメンズ、レディースも対応できるユニセックスアイテムです。 素材:コットン 100% サイズ:FREE カラー:BLACK,WHITE
着丈袖丈身幅袖口幅
FREE: 85cm 62cm 53cm 11cm

 (約/cm)

(レディース) フーディーワンピース

刺繍ロゴの中がカモ柄になっているデザインがポイント。 サイド切替部分にポケットが付いているため収納部分も充実。 フード部分にロゴも入っている為、バックスタイルのアクセントになっています。 素材:コットン 59% ポリエステル 49% サイズ:FREE カラー:BLACK,NAVY,HEATHER GRAY
着丈裄丈身幅袖口幅
FREE: 84cm 79cm 49cm 9.5cm

 (約/cm)

上司との関係に悩みうつ状態に。そこから抜け出せた理由は?

様々な分野で活躍する一流人が実践する健康マネジメント術を紹介する本コラム、今月はリーダーシップコンサルティング代表の岩田松雄氏にご登場いただく。岩田氏はゲーム開発会社アトラス、自然派化粧品販売の「ザ・ボディショップ」を運営するイオンフォレスト、そして、スターバックス コーヒー ジャパンの3社で経営手腕を発揮し、いずれも業績向上を実現した。第1回はそんな岩田氏のキャリアの原点、日産自動車勤務時代に経験したという、メンタル不調にまつわるエピソードを紹介する。

@adidasfun

選手と応援団との間にある一体感を一層高めようと思ったら、選手が発注しているショップに依頼して自分のサイズにピッタリ合った商品を製作してもらうことだ。 #フットサル #サッカー #ユニフォーム

Tricks of the Trade: LogSumExp

There are a lot of neat little tricks in Machine Learning to make things work better. They can do many different things: make a network train faster, improve performance, etc. Today I’ll discuss LogSumExp, which is a pattern that comes up quite a bit in Machine Learning. First let’s define the expression:
$$LogSumExp(x_1…x_n) = \log\big( \sum_{i=1}^{n} e^{x_i} \big)$$
When would we see such a thing? Well, one common place is calculating the cross entropy loss of the softmax function. If that sounded like a bunch of gobbeldy-gook: 1. get used to it, there’s a bunch of crazily named stuff in ML and 2. just realize it’s not that complicated. Follow that link to the excellent Stanford cs231n class notes for a good explanation, or just realize for the purposes of this post that the softmax function looks like this:
$$\frac{e^{x_j}}{\sum_{i=1}^{n} e^{x_i}}$$
where the $x_j$ in the numerator is one of the values (one of the $x_i$s) in the denominator. So what this is doing is essentially exponentiating a few values and the normalizing so the sum over all possible $x_j$ values is 1, as is required to produce a valid probability distribution.

So you can think of the softmax function as just a non-linear way to take any set of numbers and transforming them into a probability distribution. And for the cross entropy bit, just accept that it involves taking the log of this function. This ends up producing the LogSumExp pattern since:
$$\begin{align}\log\left(\frac{e^{x_j}}{\sum_{i=1}^{n} e^{x_i}}\right) &= \log(e^{x_j}) \:-\: \log\left(\sum_{i=1}^{n} e^{x_i}\right) \\ &= x_j \:-\: \log\left(\sum_{i=1}^{n} e^{x_i}\right) & (1)\end{align}$$

It may seem a bit mysterious as to why this is a good way to produce a probability distribution, but just take it as an article of faith for now.

Numerical Stability

Now for why LogSumExp is a thing. First, in pure mathematics, it’s not a thing. You don’t have to treat LogSumExp expressions specially at all. But when we cross over into running math on computers, it does become a thing. The reason is based in how computers represent numbers. Computers use a fixed number of bits to represent numbers. This works fine almost all of the time, but sometimes it leads to errors since it’s impossible to accurately represent an infinite set of numbers with a fixed number of bits.

To illustrate the problem, let’s take 2 examples for our $x_i$ sequence of numbers: {1000, 1000, 1000} and {-1000, -1000, -1000}. Due to my amazing mathematical ability, I know that feeding either of these sequences into the softmax function will yield a probability distribution of {1/3, 1/3, 1/3} and the log of 1/3 is a reasonable negative number. Now let’s try to calculate one of the terms of the summation in python:

>>> import math
>>> math.e**1000
Traceback (most recent call last):
File "", line 1, in
OverflowError: (34, 'Result too large')

Whoops. Maybe we’ll have better luck with -1000:

>>> math.e**-1000
0.0

That doesn’t look right either. So we’ve run into some numerical stability problems even with seemingly reasonable input values.

The Workaround

Luckily people have found a nice way to minimize these effects by relying on the fact that the product of exponentiations is equivalent to the exponentiation of the sum:
$$e^a \cdot e^b = e^{a+b}$$
and the logarithm of a product is equivalent to the sum of the logarithms:
$$\log(a \cdot b) = \log(a) + \log(b)$$
Let’s use these rules to start manipulating the LogSumExp expression.
$$\begin{align}
LogSumExp(x_1…x_n) &= \log\big( \sum_{i=1}^{n} e^{x_i} \big) \\
&= \log\big( \sum_{i=1}^{n} e^{x_i – c}e^{c} \big) \\
&= \log\big( e^{c} \sum_{i=1}^{n} e^{x_i – c} \big) \\
&= \log\big( \sum_{i=1}^{n} e^{x_i – c} \big) + \log(e^{c}) \\
&= \log\big( \sum_{i=1}^{n} e^{x_i – c} \big) + c & (2)\\
\end{align}$$

Ok! So first we introduced a constant $c$ into the expression (line 2) and used the exponentiation rule. Since $c$ is a constant, we can factor it out of the sum (line 3) and then use the log rule (line 4). Finally, log and exp are inverse functions, so those 2 operations just cancel out to produce $c$. Critically, we’ve been able to create a term that doesn’t involve a log or exp function. Now all that’s left is to pick a good value for c that works in all cases. It turns out $max(x_1…x_n)$ works really well.

To convince ourselves of this, let’s construct a new expressin for log softmax by plugging equation 2 into equation 1:
$$\begin{align}
\log(Softmax(x_j, x_1…x_n)) &= x_j \:-\: LogSumExp(x_1…x_n) \\
&= x_j \:-\: \log\big( \sum_{i=1}^{n} e^{x_i – c} \big) \:-\: c
\end{align}$$
and use this to calculate values for the 2 examples above. For {1000, 1000, 1000}, $c$ will be 1000 and $e^x_j – c$ will always be 1 as $x_i – c$ is always zero. so we’ll get:
$$\begin{align} \log(Softmax(1000, \left[1000,1000,1000\right])) &= 1000 \:-\: log(3) \:-\: 1000 \\ &= \:- log(3)\end{align}$$
log(3) is a very reasonable number computers have no problem calculating. So that example worked great. Hopefully it’s clear that {-1000,-1000,-1000} will also work fine.

The Takeaway

By thinking through a few examples, we can reason about what will happen in general:

  • If none of the $x_i$ values would cause any stability issues, the “naive” verson of LogSumExp would work fine. But the “improved” version also works.
  • If at least one of the $x_i$ values is huge, the naive version bombs out. The improved version does not. For the other $x_i$ values that are similarly huge, we get a good calculation. For other $x_i$s that are not huge, we will essentially approximate them as zero.
  • For large negative numbers, the signs get flipped and things work the same way.

So while things aren’t perfect, we get some pretty reasonable behavior most of the time and nothing ever blows up. I’ve created a simple python example where you can play around with this to convince yourself that things actually work fine.

So that’s a wrap on LogSumExp! It’s a neat little trick that’s actually pretty easy to understand once the mechanics are deconstructed. Once you know about it and the general numerical stability problem, it should demystify some of the documentation in libraries and source code.

To cement this in your mind (and get some math practice), I would wait awhile and then try to work out the math yourself. Also think through various examples in your head and reason about what should happen. Then run my code (or rewrite the code yourself) and confirm your intuition.

If you enjoyed reading this, subscribe in Feedly to never miss another post.

「鼻炎」に効く漢方

春先は花粉症の人には辛い時期です。しかし、この時期だけでなく一年を通じて鼻炎に悩まされる人も少なくありません。西洋医学では抗アレルギー薬や抗ヒスタミン薬で鼻炎の症状を抑えますが、それで鼻炎が治ったわけではありません。薬が切れればまた同じような症状が現れます。幸福薬局の薬剤師、幸井俊高さんは、「漢方薬で体質を改善し、鼻炎を根本的に治療します。必要なときに西洋薬を併用して症状を抑えるといいでしょう」と話します。

@adidasfun

スペインでは、フットサルは「フットボル・サラ」と呼ばれており、スペイン代表チームは2000年・2004年のFIFAフットサルワールドカップ、2005年のヨーロッパ選手権などで優勝した。 #フットサル #サッカー #ユニフォーム

肉と大豆ならどっち? たんぱく質摂取の5大ポイント

筋肉を維持するためのたんぱく質のとり方を紹介してきた本特集。これまでたんぱく質の摂取の不足はもちろん、過剰もよくないこと、そして3食コンスタントにとるとムダにならないことを紹介してきた。最終回の今回は、具体的に何を食べればいいのか、また運動と食事の関係について神奈川県立保健福祉大学教授の鈴木志保子さんに聞いていく。たんぱく質摂取は、量だけでなく「質」も大きなポイントとなる。

@adidasfun

ゴールクリアランス。ゴールラインを割ったときに最後に触れた選手が攻撃側だった場合、守備側のゴールキーパーがペナルティエリアの任意の地点からボールを投げる。直接ゴールに入れても得点とはならない。 #フットサル #サッカー #ユニフォーム