知床・釧路4日間の旅 〜大自然とグルメを満喫した道東の夏〜

夏休みを利用して、知床トレッキングと羅臼のホエールウォッチング(予定変更でドライブに)、釧路湿原を巡る4日間の旅に出かけてきました。当初の予定通りにいかないハプニングも重なりましたが、それも含めて道東らしい思い出の詰まった旅になりました。

旅程まとめ

日程 内容
1日目(8/4) 羽田→女満別、女満別空港でスープカレー、バスでウトロへ移動、オロンコ岩
2日目(8/5) オシンコシンの滝、ウトロ漁協婦人部食堂、知床五湖ガイドウォーク、BBQ
3日目(8/6) ホエールウォッチング中止→急遽レンタカーで知床峠・フレペの滝・熊の湯・クジラの見える丘公園
4日目(8/7) 釧網本線・ノロッコ号で釧路湿原を抜け、釧路空港から帰路へ

1日目(8月4日)〜移動日、女満別のスープカレーとバスガイドさんとの珍道中〜

初日は移動日ですが、それでも道東らしい出会いがたくさんありました。

羽田から女満別へ

朝早くに自宅を出発し、電車を乗り継いで羽田空港第2ターミナルへ。AIRDO便で午前中に羽田を発ち、お昼前後に女満別空港へ到着しました。

道東への玄関口、女満別空港に到着です。

女満別空港で絶品スープカレー

到着後は空港でランチタイム。せっかくなので北海道らしいものをと選んだのがスープカレーでした。

アスパラガスやニンジンなどの野菜がゴロゴロ入っているのはもちろん、なんと牡蠣やしじみといった魚介も入っていて、これがとにかく美味しかったです。野菜の甘みと海の幸の旨みがスープに溶け込んでいて、旅の始まりから北海道の豊かさを感じられる一皿でした。

女満別空港のスープカレー

バスガイドさんとの貸切ドライブ

女満別空港からウトロへの移動には、「ひがし北海道~シーサイドエクスプレスバス~紋別/知床号」を利用しました。バスガイドさんが同行し、車窓からオホーツクの自然や地域の魅力を案内してくれる観光バスです。

この日はなんと乗客が私たちだけ。貸切状態だったので、バスガイドさんとずっとおしゃべりしながらウトロまで向かうという、なんとも贅沢な珍道中になりました。移動時間そのものが観光の一部になっているのが嬉しいポイントでした。

バスの車窓からは、ウトロの手前で「カメ岩」と呼ばれる岩も見えました。国道334号沿い、ウトロ漁港のペレケ地区あたりにある岩で、名前の通り亀のような形をしているのが特徴です。

バスの車窓から見えたカメ岩

ただ、そんな和やかな道中に一つハプニングが。斜里からウトロへ向かう道で車両の横転事故が発生していて、撤去作業の進み具合によっては羅臼を経由する迂回ルートになり、到着が2時間ほど遅れるかもしれないとのこと。この先の予定がどうなるかわからず、なかなかドキドキする展開でした。結果的には事故処理が進んで通常ルートのまま予定通り進めましたが、道東の移動は天候だけでなく道路状況にも左右されるのだと実感した出来事でした。

寄り道:オロンコ岩

夕方にウトロへ到着し、宿にチェックインする前に少し時間があったので、まずはウトロ港のシンボルである「オロンコ岩」に立ち寄りました。

オロンコ岩は、ウトロ港のそばにそびえる高さ約60mの巨岩。かつてこのあたりに住んでいたとされる先住民族「オロッコ族」がその名の由来と言われていて、アイヌの伝説も残る、知床八景のひとつです。

頂上へは170段ほどある急な石段を登らなければたどり着けません。私も妻も、ぜーぜー息を切らしながらの道のりでした。それでも登りきった甲斐があり、岩の上には知床の希少な植物が生えていて、目の前にはオホーツク海が360度広がる絶景。移動の疲れも吹き飛ぶ、最高の眺めでした。

オロンコ岩から眺めたオホーツク海と夕暮れの空

岩肌には落石防止のネットが張られていて、自然の力の大きさを間近で感じました。

オロンコ岩の岩肌のクローズアップ

オロンコ岩からの帰り道、ウトロ港沿いを歩いていると「知床ウトロ 鮭の道」という看板を見つけました。ペレケ川では毎年秋(8月下旬〜10月頃)に、産卵のため川をのぼる鮭や鱒の姿を見ることができるのだそうです。訪れたのは8月上旬だったので鮭の遡上には少し早い時期でしたが、知床が「鮭の町」でもあることを知る良いきっかけになりました。

知床ウトロ鮭の道の看板

しれとこ村へチェックイン

オロンコ岩を満喫したあと、宿泊先の「しれとこ村」へ。翌日からの知床トレッキングに備えて、この日はのんびりと過ごしました。

しれとこ村の入り口

しれとこ村のお風呂は、とにかくお湯が熱く、泉質も良いのが印象的でした。あまりの気持ちよさに、滞在中は毎日2回入ることになりました。

この日の移動まとめ

時間帯 内容
自宅発
昼前 AIRDO便 羽田→女満別
女満別空港でランチ(スープカレー)
昼過ぎ 女満別空港発(網走バス シーサイドエクスプレスバス)
夕方 ウトロ着(道中、事故による迂回の可能性ありでヒヤヒヤ)
夕方 オロンコ岩を散策
しれとこ村にチェックイン

2日目(8月5日)〜オシンコシンの滝、婦人部食堂の三色丼、そして知床五湖へ〜

2日目は、知床の自然をたっぷり満喫する一日でした。

しれとこ村で朝食

出発前に、しれとこ村の朝食をいただきました。焼き魚やお浸し、山菜の小鉢などが並ぶ、体に優しい和食の朝ごはんで、この日の行動に向けてしっかりエネルギーを補給できました。

しれとこ村の朝食

朝はオシンコシンの滝へ

朝一番で向かったのはオシンコシンの滝。国道334号沿いにある、知床八景のひとつにも数えられる滝です。非常に大きく、間近で見るとかなりの迫力がありました。

オシンコシンの滝

滝の周りだけ気温が数度下がっているように感じるほどのひんやりとした空気で、夏の暑さを忘れて涼むことができました。

ウトロ漁協婦人部食堂で三色丼

お昼は、ウトロ漁港のすぐそばにある「ウトロ漁協婦人部食堂」へ。地元漁師の奥様たちが切り盛りする、地元では有名な食堂です。目の前にはウトロ漁港が広がり、潮の香りを感じながら食事ができるロケーションも魅力でした。

ウトロ漁協婦人部食堂の入り口

注文したのは三色丼。いくら、鮭、サーモンがのった一品です。サーモンは脂がしっかりのっていて、口の中でとろけるような美味しさ。いくらは一粒一粒がしっかりとした食感で、噛むとぷちっと味が弾ける感じがたまりませんでした。どちらも、関東の飲食店ではなかなか味わえないクラスの美味しさでした。

婦人部食堂の三色丼

知床五湖ガイドウォーク

午後は知床五湖へ。実は5月10日〜7月31日は「ヒグマ活動期」と呼ばれ、この時期はガイドの同行が必須(個人での立ち入りは不可)なのですが、私たちが訪れた8月頭は植生保護期にあたり、レクチャーを受ければガイドなしでも歩ける時期でした。とはいえ知床は初めてだったので、安心のためガイドさんに同行してもらうことにしました。

これが大正解で、自分たちだけではまず気づけないものをたくさん教えてもらいました。

  • ヒグマの爪痕
  • 木を転がしてアリを食べた跡
  • 睡蓮を食べているエゾシカの姿

睡蓮を食べるエゾシカ

知床五湖の湖畔風景

特に印象的だったのは睡蓮のエピソードです。ガイドさんによると、知床五湖に咲く睡蓮は、明治から大正にかけてこの地を観光地にしようと考えた人々の手によって湖に放たれたものなのだそう(※この逸話は今回ガイドさんから聞いたお話です)。今では知床五湖の風景の一部となっていますが、そんな人の手が入った歴史があるとは知りませんでした。

夜はウトロ東BBQで熊肉・鹿肉

夜はウトロ東でBBQを楽しみました。熊肉、鹿肉というジビエらしいメニューに、キリッとしたIPAビールを合わせて乾杯。熊肉はハート(心臓)の部位もいただきましたが、クセが少なくレバーとはまた違った独特の食感で、なかなか食べられない貴重な部位を味わえました。知床の自然を歩いた後だからこそ、余計に味わい深く感じられました。

この日のまとめ

時間帯 内容
しれとこ村で朝食、オシンコシンの滝を見学
11:30頃〜 ウトロ漁協婦人部食堂で三色丼
午後 知床五湖ガイドウォーク
ウトロ東でBBQ(熊肉・熊のハート・鹿肉・IPA)

3日目(8月6日)〜ホエールウォッチング中止、急遽ドライブ旅へ〜

3日目は、当初の予定が大きく変わる一日になりました。

ホエールウォッチング中止、レンタカーでのドライブへ

もともと羅臼でホエールウォッチングクルーズに参加する予定でしたが、強風と高波の影響で出航中止に。急遽予定を変更し、レンタカーで知床峠付近をドライブすることにしました。

車を運転するのは久しぶりで、ハンドルを握る前は少し緊張しましたが、走り出してしまえば体が運転の感覚を覚えていて、すぐに慣れることができました。

知床峠展望台

まず向かったのは知床峠展望台。標高738mの峠にある展望スポットで、天気が良ければ羅臼岳や国後島まで見渡せる、知床八景のひとつです。この日は羅臼岳の雄大な姿をしっかり眺めることができました。

峠周辺は、強風にさらされながら育つハイマツの樹海と針葉樹林が広がっていて、知床らしい厳しくも豊かな植生を感じられました。

知床峠展望台からの眺め

フレペの滝(乙女の涙)

次に向かったのはフレペの滝。知床自然センターの裏手から遊歩道を20分ほど歩いた先にあります。この滝へ向かう道のりが、まるで森の中を歩くトレッキングのようで、とても楽しい時間になりました。

フレペの滝への遊歩道

フレペの滝の案内看板

フレペの滝は、川ではなく知床連山からの地下水が断崖からしみ出して海へ流れ落ちるという珍しい滝で、その繊細な流れ方から「乙女の涙」とも呼ばれています。断崖の周りにはツバメが何羽も飛び交っていて、知床らしいスケールの大きな景色を堪能できました。

フレペの滝周辺の断崖と灯台

熊の湯で無料の露天風呂

続いて立ち寄ったのは「熊の湯」。地元の方々が管理する無料の露天風呂で、開放的な自然の中でゆったりと湯に浸かることができました。運転の疲れも吹き飛ぶ、贅沢なひとときでした。

熊の湯

クジラの見える丘公園

続いて立ち寄ったのは羅臼の「クジラの見える丘公園」。丘の上から海を一望できるスポットで、この日は残念ながらクジラには出会えませんでしたが、羅臼の海を眺めながらゆっくり過ごすことができました。ここでレンタカーを返却し、ドライブは終了です。

クジラの見える丘公園からの眺め

夕暮れ時には、羅臼の街並みと川、その奥にそびえる山々が美しいシルエットを描いていました。

羅臼の夕暮れ

夜は黒ハモ丼とサメガレイ、日本酒で乾杯

夜は黒ハモ丼とサメガレイをいただきながら、根室の地酒「北の勝 大海」で乾杯。

黒ハモ丼、サメガレイの煮付け、北の勝

ホエールウォッチングは中止になってしまいましたが、ハプニングで急遽レンタカーでのドライブに変更したこの日が、意外にもこの旅で一番思い出深い一日となりました。予定外の展開だったからこそ、知床峠やフレペの滝、熊の湯など、その場の判断で組み立てた行程が印象に強く残ったのだと思います。

この日のまとめ

内容
ホエールウォッチング中止(強風・高波)
レンタカーで知床峠展望台へ(羅臼岳・国後島)
フレペの滝(乙女の涙)を散策
熊の湯で無料露天風呂
クジラの見える丘公園
夜は黒ハモ丼・サメガレイ・日本酒

4日目(8月7日)〜釧網本線とノロッコ号、釧路湿原を眺めながらの帰路〜

最終日は、ウトロを離れて釧路空港へ向かう移動日。道東ならではの鉄道旅を満喫しました。

しれとこ摩周号で知床斜里駅へ

まずはウトロから知床斜里駅まで釧網本線で移動。平日の昼間にもかかわらず、しれとこ摩周号の車内はとても賑わっていました。夏の観光シーズンならではの活気を感じました。

塘路駅からノロッコ号で釧路湿原を抜ける

続いて乗り込んだのは、夏の風物詩「くしろ湿原ノロッコ号」。乗り換え駅の塘路駅は「湿原に出会える塘路駅」という看板が出迎えてくれる、小さくて素朴な木造の駅舎でした。

湿原に出会える塘路駅

塘路駅から釧路駅までを、窓が大きく開放的なオープンタイプの車両で楽しめる列車です。

車窓からはエゾシカやタンチョウの姿を眺めることができ、車内では車内販売のサイダー、クラフトビールで乾杯しながらのんびり過ごせました。釧路湿原に関する案内アナウンスも随所に入り、ただ移動するだけでなく、湿原についての理解も深まる、とても満足度の高い乗車体験になりました。

ノロッコ号の車窓から見た釧路川と湿原の緑

ノロッコ号

車内で購入したサイダーとクラフトビール、そしてノロッコ号名物のプリンはこちら。

サイダーとクラフトビール、ノロッコ号プリン

釧路空港でシメの一食

釧路空港に到着してからは、炙りサーモンといくらがたっぷりのった海鮮丼、そしてえびラーメンをいただきました。特にえびラーメンは妻が絶賛するほどの美味しさで、旅の最後にふさわしい一杯になりました。

炙りサーモンといくらの海鮮丼

釧路空港で食べたえびラーメン

この日のまとめ

内容
ウトロ→知床斜里駅(しれとこ摩周号)
塘路駅→釧路駅(くしろ湿原ノロッコ号、エゾシカ・タンチョウを車窓から)
釧路空港でいくらサーモン海鮮丼&えびラーメン

4日間を振り返って

全体を通して、仕事に忙殺されていた日々から強制的に頭を切り離し、知床の雄大な自然を満喫しつつ、美味しいご飯もたっぷり楽しめた、大満足の旅になりました。

一方で反省点もありました。ヒグマが怖くてレンタカーの運転を控えてしまったことや、各種予約が旅行の直前になってしまったことです。次回、道東を旅する機会があれば、この2点を意識してもっと余裕を持った計画にしたいと思います。

これで知床・釧路4日間の旅の記録は終わりです。読んでいただきありがとうございました。

また、このブログは、旅の道中で感じたことや出来事をその都度Claudeに伝えて記録し、最後にまとめてもらったものです。

横浜マラソン2025 フルマラソン 参加日記

はじめに

2025/10/26(日)に開催された横浜マラソン2025において、フルマラソンに参加してきました。 高校生の頃に学校行事でフルマラソンがあったのですが、大人になってからは初めての挑戦です。 今回はその日記を残そうかと思います。

横浜マラソンの公式サイト https://yokohamamarathon.jp/ より引用

↑は横浜マラソンの公式サイトの画像です。「横浜を走る、世界が変わる。」というキャッチコピー、個人的にとても好きです。

前日まで

2025年8月ぐらいから数ヶ月、横浜マラソン2025に向けての練習を行なっていました。具体的には、週に数回程度家の近くを走り、月に1回はマラソン大会に参加するようにしてしました。しかし、横浜マラソン2025の直前は、週に1回、2~3km程度を走る程度の練習しかできていませんでした。ちょっと不安もありながら、本番当日を迎えます。

当日

本番直前まで

朝は5時15分に起き、6時に家を出ました!朝が早い! 家の最寄駅の電車の中で、装備が明らかにランナーな方々がちらほらいました。「お互い無事に帰ってこようぜ...!」と、勝手に戦地に赴く仲間だと感じながら会場に向かいました。

7時20分ごろ桜木町駅に到着しました。ちょっとトイレに寄って行こうかと思いましたが、さすが参加者が数万人の横浜マラソン、ぜんっぜんトイレが空いていません..! 仕方がないので走っている途中でお手洗いに寄る決心をし、パシフィコ横浜に荷物を預け、8時10分に整列完了します。

スタート直前の様子

スタート!

スタートを知らせる運営の方の声が会場に響き渡り、いよいよ横浜マラソン2025が始まります!参加者が非常に多いため、スタート直後は待機、数分後にポツポツと歩き始め、実際に走り始めるまでは10分程度かかりました。

あいにくの雨天ですが、天気を恨んでも何も良いことはないため、「涼しくて走りやすい気候だ!よかった!」とポジティブに捉えることにしました。

前半

かなり気持ちよく走れました。まず、横浜の景色が綺麗です!ランドマークタワー横浜赤レンガ倉庫などを眺めながら気持ちよく走ることができました。

また、応援の方も非常に多く、道路で声をかけてくれる方や、吹奏楽団、チアガール、ゴスペル、子供のダンサーを歌う方など、様々な方法で応援してくれました。「応援で力をもらう」とはスポーツ選手の方がよくいうセリフですが、私は今までピンときたことがありませんでした。しかし、人生で初めて、「応援で力をもらう」と言うことを体験できたかもしれません。

スタート直後

10km~15kmあたりの、横浜の道路

半分

24km地点までは、6分/kmのペースで来ており、自分としてはかなり良い感じに走れていました。しかし、折り返し地点にきつめの坂があり、坂を勢いよく登ったあたりで問題が発生します。両足の太ももを同時に攣ってしまいました。また、足を地面につくと骨がかなり痛む状態です。

これは、自分の練習不足と、半分地点までのペースを上げすぎたのが原因だと考えました。気持ち的にはかなりキツくなりましたが、「この横浜マラソンは歩いても良いから、最後まで諦めずにゴールする」ことが目的であると改めて認識し直しました。その認識をもとに、走ったり歩いたりを繰り返しながらなんとか1kmずつ進みました。

辛い時間も多かったですが、笑顔を作ると気持ちも前向きになることを実感しました。

給水地点ではほぼ歩いていたため、横浜マラソン向けの美味しいスイーツを大量に頂くことができたのが楽しかったです笑 一番美味しかったのはダブルマロンでした。

30km地点のエネゴリくん

ゴール直前

そんなこんなでだいぶペースを落としながら、なんとかゴール直前まで来ることができました。ここらで応援も最高潮になり、気分も少しづつ上がっていきます。可能な限り走り続けました。

ゴール

ゴール直前のアップダウンが少しある橋に苦しみながらも、なんとか最後の1km程度は走ることができ、ゴールしました。タイムは5時間20分でした。

完走直後の記念写真

良かった点

まず、無事ゴールすることができて良かったです。次に、街に一体感が生まれ、開催日は横浜中がマラソン一色に染まることが本当に凄いと感じました。さらに、応援を自分の力に変えることができたのも良かったです。

また、これは横浜マラソンというよりマラソンの練習含めた日常生活に関する話ですが、普段の体調面・メンタル面がかなり改善したと感じます。走った直後は明確に思考がポジティブになるのを感じるようになりました。

反省点

練習が少なすぎました。練習では最大ハーフ(約21km)までしか走っていませんでした。そのため、24kmあたりで両足を攣って動けなくなるのも当たり前でしょう。次回のフルマラソンでは30kmまで歩かずに走り切るのを目標にしたいと思います。

次に、走り方にも注意が必要だと感じました。おそらく太ももに負担がかかる走り方になってしまっているため、より下半身の筋肉全体を使えるような走り方を身につけていきたいと思います。

また、今回は会社の人と一緒に参加し、スタート前に合流しようと思っていたのですが、あまりに人が多くスタートの時間までに合流するのが難しいため、断念せざるを得ませんでした。最初からスタート前の合流は諦め、ゴール後に集まるようにした方が良さそうです。

最後に

横浜マラソン2025、最高に楽しかったです。参加するか悩んでいる方いたら、この機会に一度味わっておくと人生の捉え方が変わるかもしれません。

感想「世界一流エンジニアの思考法」

感想

本書は、米マイクロソフトのソフトウェアエンジニアの方によって執筆された本だ。書籍の中では、主に労働の面で、著者の環境と日本の一般的な環境の違いを説明している。

本書を読んでまず思ったことは、現在勤めている会社の状態とかなり近いと感じ、それが嬉しかった。失敗を責めるようなことはしない、むしろ挑戦したことを讃え、成果が出た人は賞賛される。著者の中で明言はされていなかったが、挑戦し、中々成果として実らないまま去った人も多くいるだろう。成果主義のあるべき姿だと私は考える。

その中でも、気付かされることが多くあった。以下に箇条書きにする。自分が優先的に真似すべき順に記載している。

  • 「理解は時間がかかるもの」として、急がず、徹底的に理解する習慣をつけていくこと
  • 今手を付けている仕事を一つに限定すること
  • 重要な部分を見極め、スコープから簡単に外すこと
  • 最初から全部説明せず、「情報量を減らす」コミュニケーションの仕方がすごく重要なこと
  • Pull Requestsのレビューを減らすには、「読んだ人がどう感じるか?」を意識しながらコードを書く必要があること
  • 異なる趣味を行うような休息が重要なこと

詳細が気になった方はぜひ本に手に取ってみて欲しい。

感想「ユニクロ」

読んだ本

感想

面白かった。お勧めする。

まず、ユニクロの見え方が変わった。私は、正直ファッションに拘りがない。普通であれば良いと思っている。そのような方は結構多いのではないかと思う。社会人になった頃(2015年)から気づいたらユニクロの服ばかりを着るようになっていた。丈夫だし、安いし、見た目も無難である。ファッションに時間をかけたくないという考えもある。

「丈夫だし、安いし、見た目も無難である。というイメージに対して、本書を読むとユニクロの努力があったことが窺い知れる。ユニクロの企業イメージは「安かろう、悪かろう」に近くなっていた時期もあったという。そのイメージをいかにして払拭していったかが本書を読むと分かる。

更に、ユニクロの店舗の見え方が変わった。本書内では、「ユニクロとはなにか」「ユニクロの服とはなにか」という問いが何度も登場する。その答えの1つとして、圧倒的な陳列、つまり、同じ色の服を下から上までずらりと積み上げて圧倒的な量とカラーバリエーションが一目瞭然になるように服を並べること、それを徹底することが説明されている。このような背景を知ると、普段は何も思わなかった店内に対し、陳列の仕方、客が着た服を丁寧に折り畳みなおす店員さんの動き方が素晴らしいと思えるようになった。

さらに、有機野菜事業で失敗したが、その反省を社内展開し、GUブランド事業を任され躍進に成功させ、汚名返上に成功した柚木治さんのエピソードに心が打たれた。勝つまでやり抜くことの大切さが分かった。

著者の語り口も好みである。基本的には淡々とした口調で描写をするが、時折熱い想いが感じられる描写をする。著者は日本経済新聞編集委員の方であり、ユニクロの関係者ではない。ゆえに、どれだけの時間をかけ調査・インタビューを行い、文章に起こし、校正を重ねたのかと考えると頭が上がらない。

まとめると、ユニクロに対する理解が深まり、ファーストリテイリング社の人たちが本気で事業を世界に広げようとした際の葛藤を感じることができた。493pもページが存在する分厚い本なのだが、読み始めると中々止められない程面白かった。おすすめである。

NLP2025で面白かった発表まとめ

NLP2025に参加したため、面白かった発表を簡単にまとめます。

言語処理学会第31回年次大会(NLP2025)

ちなみに、自分の発表はこちらです。

(○齋藤 慎一朗, 髙橋 寛治 (Sansan))

モデル拡張によるパラメータ効率的な LLM の事前学習

○矢野 一樹 (東北大), 伊藤 拓海 (東北大/Langsmith), 鈴木 潤 (東北大/理研/NII)

予稿

事前学習を2段階に分けて行なっており、小規模なモデルに対して標準的な事前学習を行なった後、学習済みモデルに新たな層を追加してモデルを拡張しPETを付与して継続事前学習を行う方法です。

まず、事前学習を2段階に分けて行うという発想が私にはなく、新鮮でした。「LLM事前学習の効率化と性質改善: 埋め込み層および出力層のパラメータ固定による再利用」でも2段階での事前学習を行われており、今後主流になる可能性もあると思いました。多くの企業において、事前学習のための大規模なGPUの確保が課題になっており、その解決策の一つとして有力な方法と感じました。

自己修正に基づく固有表現抽出モデルの指示学習

○高橋 拓誠, 谷口 友紀, 大熊 智子 (旭化成)

予稿

固有表現抽出(NER)タスクについて、まずは一般的なNERの学習をk-foldでの学習を行い、学習済みモデルを用いて、OOFに対する推論を行います。次にOOFの中で間違ったデータと正解データを用いて、自己修正を行えるようなデータを用意し学習を行い、推論時もNER + 自己修正を行うアプローチを提案していました。

NERは勤め先的にも個人的にも興味があるタスクであり、そのNERに対し、直近のLLMにおけるprompting手法でもある自己修正を組み合わせるアイディアがとても良いなと感じました。

日本語大規模言語モデルの事前訓練過程における下流タスク性能の網羅的な分析

○西田 悠人, 小田 悠介 (NAIST/NII), Namgi Han (東大), 高木 優 (NII), 宮尾 祐介 (東大/NII)

予稿

LLMの事前学習が、下流タスクの性能がどう変わるかを調査されていました。具体的には、漸進型(学習初期から後期にかけて徐々にスコアが向上するもの)、二段階型(学習初期に急激にスコアが上昇し,停滞を経たのちに学習後期に再びスコアが徐々に向上し始めるもの)、後発型(学習初期は全くタスクが解けず,学習後期から徐々にスコアが向上し始めるもの)の3つに分けられることが報告されていました。

個人的に、どのような事前学習を行うと下流タスクにどのような影響があるのか、もっと言うと下流タスクの性能改善をしたい場合、事前学習はどの程度意味があるのかを事前学習をする前から見積もりたいという課題感があり、その課題解決のためのヒントが得られるような発表だと感じました。

文脈内学習におけるデモの親和性と多様性の提案

○加藤 万理子, 趙 羽風, 坂井 吉弘 (JAIST), 井之上 直也 (JAIST/理研)

予稿

In-Context Learningにおいて、正解に対する「親和性」と「多様性」をインダクションヘッドを用いて抽出することで、どのような例(デモ)を与えると、ICLを用いたタスク性能の向上するかの示唆が得られることを発表されていました。

ICLの一環であるFew-shotの例はいつもなんとなくで選んでいたのですが、その方針を得ることができるような発表だと感じました。

思ったこと

私の発表がクローズドなデータでの発表であり、一方NLP界隈への貢献のためにはより一般的な手法での提案が必要だと感じました。 まだアイディア段階ですが、LLMの事前学習におけるメモリ効率化の方針で次回は発表できたらと思います。

終わりに

多くの方々と交流させていただき、非常に刺激を受ける会でした。ありがとうございました。 次回も参加できるよう頑張りますので、今後もよろしくお願いします!

コンサル一年目が学ぶこと 感想

ビジネスで必須な能力が、非常にシンプルにかかれている。ただし一年目に限定した内容である。まだまだ出来ていないことも多いと感じた。

 

以下に、特によかった内容をまとめる。

  • 結論から話す、物事がシンプルに明確になるから
  • 相手が無言でいたら、それは理解しているからではなく、理解していないサイン
  • 言葉を相手に合わせることは、相手の考え方を理解すること
  • ビジネス能力を向上させるのは、情報量ではなく、考えることである。考えるとは、端的に言って、自分の意見をもつことである。

Polarsのsortはどこに実装されているのか ~デバッグの仕方を添えて~

はじめに

この記事はPolars Adbent Calendar 2023 22日目の記事です。

Polarsの公式より引用

本記事では、Python版のPolarsについて話します。

Polarsは動作が早いです。Polarsが高速に動作する要因は複数ありますが、その一つに高速に動作するRustで書かれているから、というものがあります。

Python上でPolarsを扱う際にもこのRustの恩恵にあずかれるということは、Rustの実装をPython上で呼び出せるような仕組みがどこかにあるはずです。

この、別の言語間で相互で呼び出せるようにする仕組みのことをバインディングと呼びます。今回はPythonとRust間のため、Python↔︎Rustバインディングの仕組みが存在することになります。

PolarsではPython↔︎Rustバインディングとして、PyO3とmaturinが利用されています。

Polarsの実装を追っていると、このバインディングの仕組みを理解しないと実装を追えない場面が多々出てきます。今回はsortを例に、このPyO3/maturinがどのように用いられているか理解し、Polarsの実装を可能な限り追ってみることにします。

注: 私のRustの知識不足もあり、Rust側の実装を追うパートは怪しい内容になっています。わかる方いたら追記しますので是非教えてください。

PyO3とmaturinとは何か?

PyO3はRustとPythonバインディング機能を提供するライブラリです。

maturinはRustをPythonパッケージとしてビルドし、publishするためのライブラリです。以下の図がその関係性を分かりやすく表しています。引用元

システム開発におけるmaturinとPyO3の関係

実装が追えなくなる場面

今回は、polars.DataFrameのsort機能を使う場面で説明します。以下のコードはPolarsのバージョン0.20.2です。

例えば、以下のようなコードがあるとします。

import polars as pl

df = pl.DataFrame("../input/titanic.csv")

df.sort("fare")

titanic.csvは、Kaggleなどで用いられるタイタニックの乗船客のデータです。 タイタニックの乗船客のデータをfare(料金)ごとにsortする非常にシンプルなコードです。

では、df.sort("fare")の中ではどのような実装をしているかを見ていきましょう。

VSCodeでのデバッグを行なっていきます。df.sort("fare")の行にbreakpointを打ち、↓(Step Into)を行います。

sortを行う

Step Intoをすると、Polarsライブラリの実装を見に行くことになります。ただし、VSCodeデバッグは、デフォルトでは外部ライブラリの実装を見に行かないため、VSCodeデバッグの設定ファイルであるlaunch.jsonの設定を変更します。

まず、下記の歯車ボタンを押します。

歯車を押す

すると、launch.jsonが立ち上がるので、justMyCodeの部分をtrueからfalseに変更しましょう。

launch.json

無事、Polarsの実装を見に行けると、以下のような画面になると思います。

sort

sortの中では

(
    self.lazy()
    .sort(by, *more_by, descending=descending, nulls_last=nulls_last)
    .collect(_eager=True)
)

というようなコードが行われていたんですね。.lazy().collect(_eager=True)はlazy APIのためのコードのため、sortは.sort(by, *more_by, descending=descending, nulls_last=nulls_last)で行われていることになります。

では.sortの中身を見てみましょう。Step Over(左から2番目、時計回りの矢印)を一度クリックし、.sortがハイライトされた状態にします。

Step Over

上記画面になったら、再度↓(Step Into)を行います。今回は5-6回↓ボタンを押す必要があると思います。すると以下のような画面にいきます。

LazyFrameのsort

おそらく、sortの処理は、self._ldf.sort(by, descending, nulls_last, maintain_order)で行われていそうだと分かります。sortself._ldfのメソッドのようですが、self._ldfとはなんでしょうか?こういう時はVSCodeの「Go To Definition」が便利です。_ldfをダブルクリックし、右クリックで表示されるメニューから「Go To Definition」を選択します。

Go To Definition

すると、_ldf: PyLazyFrameという実装が見つかります。

_ldfの実装元

今度はPyLazyFrameが何かという話になりますね。再度「Go To Definition」を行います。

追えない図

あれ?追えません。仕方ないのでCtrl + FでPyLazyFrameを検索しましょう。

すると、以下のようなコードが見つかりますが、VSCodeシンタックスハイライトが機能していません。

PyLazyFrameの呼び出し元

そう、このfrom polars.polars import PyLazyFrameこそが、PolarsがRustで書かれた実装をPyO3/maturinを用いてPythonモジュールとして呼び出されている箇所なのです。

つまり、sortの実装の本体を追いたければ、from polars.polars import PyLazyFrameがどこから呼び出されているのかを知り、PyLazyFrameに対してsortメソッドを用いた場合にどのコードが呼ばれるかを知る必要があるわけです。これは大変だ。

大変な時の顔

Polarsにおいて、PyO3/maturinが使われている箇所、およびその読み方

というわけで、課題感としては「Python側の実装で呼び出されているRustの実装が追えない」ということにありました。 ここからはRust側の実装を追ってみましょう。

まず前提知識なのですが、Rustはパッケージを作る際、Cargo.tomlというそれらのクレート(バイナリかライブラリ)をどのようにビルドするかを説明するファイルを持ちます。また、src/main.rs が、パッケージと同じ名前を持つバイナリクレートのクレートルートであるという慣習があります。同じようにCargoはパッケージディレクトリにsrc/lib.rs が含まれていたら、パッケージにはパッケージと同じ名前のライブラリクレートが含まれており、src/lib.rs がそのクレートルートなのだと判断します。

参考: doc.rust-jp.rs

src配下にsrc/main.rsかsrc/lib.rsのどちらかがあれば、そこからパッケージが呼び出されているはず、ということになります。

では、GitHubの画面で見てみましょう。Linkはこちら

PolarsのGitHub

src/main.rsはなく、src/lib.rsがあるこが分かります。

では次に、src/lib.rsの中身を確認します。上から辿っていくと、fn polarsというそれっぽい実装がされている箇所が見つかります。

PyO3/maturinが利用されている箇所

ここが、PyO3によってPython↔︎Rustバインディングを行なっている箇所になります。#[pymodule]で指定されたモジュールがPythonにエクスポートされます。m.add_class::<PyLazyFrame>().unwrap();とあるため、PyLazyFrameもここでpolarsのクラスとして追加されていることが分かります。つまり、このPyLazyFrameが、先ほどPython側でも利用したモジュールになるはずです。

参考:

pyo3.rs

PyLazyFrameがどこから呼び出されているかを再度検索すると、use crate::lazyframe::PyLazyFrame;と呼び出されていました。

Rustでcrateから呼び出されている場合は、クレートルート(この場合はsrc/lib.rs)からの呼び出しになるため、crate::lazyframesrc/lazyframe.rsで実装されていることになります。

そのため、今度はsrc/lazyframe.rsを見ていきます。Linkはこちら

コードを上から追っていくと、sortメソッドらしきものが見つかります。

sort ・・・?

「これが我々が追い求めていたsortの実装!?」と喜ぶのは束の間、このsortはself.ldfのメソッドを呼んでいるだけのメソッドだと分かります。 このself.ldfを検索を行うと、以下のself.ldf = LazyFrame::from(lp);という実装で呼び出されていそうです。そしてこのlpはLogicalPlanという型で実装されています。

self.ldfの呼び出し元

(ここからはRustの知識不足に伴い、かなり怪しいです。間違っていたらぜひ教えてください。)

このLogicalPlanがどこで実装されているかを調べていくと以下のようなコードが見つかります。Linkはこちら

LogicalPlanBuilder

このコードの意味をChatGPTに聞くと、

LogicalPlanBuilder という名前の公開構造体(pub struct)を定義しています。この構造体は、LogicalPlan(論理計画)を公開フィールドとして持っており、これにより他のコードからアクセス可能になります。

と回答がありました。つまり、LogicalPlangはLogicalPlanBuilderによって構築されると考えられます。

このLogicalPlanBuilderの実装の中から、sortメソッドらしきものを探すと、以下が見つかります。コードはこちら

我々が追い求めてたsort?

このコードをChatGPTに説明してもらうと

このコードは、Polarsデータフレームライブラリの一部で、LogicalPlanBuilderのsortメソッドを定義しています。このメソッドはソート操作の論理計画を作成するためのものです。パラメータとして列のベクトル(by_column)、各列が降順かどうかを示すブール値のベクトル(descending)、null値を最後にするかどうかのブール値(null_last)、そしてソートした際に元の順序を維持するかどうかのブール値(maintain_order)を取ります。これらのパラメータを使用して、ソートの論理計画を表すLogicalPlan::Sort構造体を生成し、それを元にデータフレームに対するソート操作の実行計画が立てられます。

とあるので、どうやらこれが我々が追い求めていたsortの実装・・・なんですかね?Sort構造体を作る、とあるので、まだ実装は別の部分にある気がします。

が、これ以上は追い方が分からないため、今回はここまでとします!

最後に

もしsortがどこで実装されているか分かる方がいらっしゃったらぜひ教えてください🙇‍♂️

https://twitter.com/sinchir0