本章では、時系列データを扱うAIがどのように進化したかを探ります。過去の情報を忘れてしまうRNNの課題を、Transformerの「自己注意機構」がどう解決し、さらに最新モデルがどう効率化しているのか、その核心を掴みます。
RNNの課題:情報を順番に処理する「伝言ゲーム」方式では、遠い過去の情報が失われがちでした(長期依存性の問題)。
Transformerの解決策:「自己注意機構」により全時点を一度に見渡し、過去の重要情報を直接参照する「会議室」方式でこの問題を克服しました。
Transformerの課題である O(N2) の計算量を改善するモデルです。
Informer: 「スパース自己注意」で重要な情報だけを選抜して計算を効率化します。
Autoformer: 「自己相関」でデータが持つ周期性に着目し、高速に関係性を捉えます。
時系列を「点」ではなく「パッチ(かたまり)」で捉える実用的なモデルです。
利点: ノイズに強く、複数変数(心拍数、血圧など)を扱うチャンネル独立性が医療データと好相性です。計算も効率的になります。
日々の診療で、皆さんも電子カルテに記録された患者さんの長い経過を前に、頭を悩ませることがあるのではないでしょうか。数ヶ月前の検査値の小さな変化、数週間前に開始された薬剤、そして今日の急なバイタルサインの変動…。これら無数の点と点を繋ぎ、意味のある一つの「物語」として読み解くことは、ベテランの医療者にとっても至難の業です。
こうした膨大な医療時系列データをAIで解析し、病状の悪化予測や治療介入の最適化に繋げようという試みが世界中で加速しています。その中で主役を担ってきたのが、RNN (Recurrent Neural Network) やその発展形である LSTM (Long Short-Term Memory) といったモデルでした。
これまでの時系列モデル(RNN/LSTM)が抱えていた壁
RNNやLSTMは、過去の情報を「記憶」しながら、時系列を順番に読み解いていくのが得意です。昨日の情報が今日の記憶を作り、今日の記憶が明日の予測に繋がる、という直感的に分かりやすい仕組みを持っています。
しかし、この「順番に伝言ゲームのように情報を伝えていく」という性質が、実は大きな壁となっていました。例えば、3ヶ月前の投薬開始という重要な情報が、今日の容態を予測するために必要だとします。RNN/LSTMでは、この情報を3ヶ月間、一日も忘れずに記憶し続けなければなりません。伝言ゲームの途中で情報が薄れたり、他の情報と混ざってしまったりするのと同じで、時間が経つほど過去の重要な情報が失われてしまう「長期依存性の消失」という課題を抱えていたのです。
この様子を少し図式化してみましょう。
上の図のように、時点1で発生した重要な「情報A」が、新しい情報(B, C…)が加わるたびに少しずつ薄まっていき、現在(時点t)の予測を立てる頃には、その影響力がほとんど失われてしまう可能性があります。これでは、遠い過去の出来事が決定打となるような複雑な病態の解析は難しいと言わざるを得ません。
パラダイムシフトの到来:Transformerモデル
この根本的な課題を、全く新しいアプローチで解決したのがTransformerモデルです(1)。もともとは機械翻訳などの自然言語処理のために開発されたこのモデルの最大の特徴は、「自己注意機構(Self-Attention)」にあります。
自己注意機構は、時系列上のすべての時点を一度に見渡し、「現在の予測を行う上で、過去のどの時点の情報がどれくらい重要か?」を動的に判断し、重み付けを行います。伝言ゲームのように情報を順番に伝えるのではなく、いわば「全体を俯瞰できる会議室」のようなものです。
会議室にいる全員(すべての時点のデータ)が互いに直接コミュニケーションをとり、今の議題(現在の予測)にとって最も重要な発言者(過去の重要な時点)に注目する、といったイメージです。これにより、3ヶ月前という遠い過去のデータであっても、AIが「重要だ」と判断すれば、その情報を直接、かつ強力に現在の予測に反映させることができるのです。
この革新的な仕組みによって、TransformerはRNN/LSTMが苦手としていた長期的な依存関係を鮮やかに捉えることに成功し、時系列解析に大きなブレークスルーをもたらしました。
本稿では、このTransformerを医療時系列データへ応用するための旅に出かけます。まずはその心臓部である自己注意機構の仕組みに迫り、次にその強力さゆえに生じる課題と、それを乗り越えるための最新モデルたちを概観します。そして最後に、実際の医療現場でどのように活用され始めているのか、具体的な応用例を見ていきましょう。
なお、本記事はシリーズ第8回の全体像を掴むためのダイジェスト版です。各章で登場するより詳細なアルゴリズムの解説や、具体的なPythonコードを用いた実装については、今後公開されるT8.1、T8.2…といった個別の記事でじっくりと扱いますので、どうぞご期待ください。
T8.1:自己注意機構(Self-Attention)の仕組みと課題
さて、ここからはいよいよTransformerの心臓部である自己注意機構(Self-Attention Mechanism)の世界に深くダイブしていきましょう。前の章で「会議室のようなもの」という話をしましたが、この章ではその会議室で「具体的にどのようなやり取りが行われているのか」を、数式や図を交えながら、できるだけ直感的に解き明かしていきます。
私自身、初めてこの概念に触れたときは、そのエレガントさと強力さに非常に感銘を受けた記憶があります。きっと皆さんも、この仕組みを理解すれば、AIが時間という概念をどう捉えようとしているのか、その一端を感じ取れるはずです。
「クエリ・キー・バリュー(QKV)」モデル:アテンションの核心
自己注意機構の動きを理解するための鍵となるのが、「クエリ(Query)」「キー(Key)」「バリュー(Value)」という3つの要素です。ちょっと抽象的に聞こえるかもしれませんが、データベースや図書館での検索をイメージすると、グッと分かりやすくなります。

| 要素 | 役割のイメージ(図書館での検索) | 医療時系列データでの例 |
|---|---|---|
| クエリ (Q) | あなたが探している「検索ワード」 | 「今日の高血圧の原因は何か?」という問い |
| キー (K) | 各本の背表紙に貼られた「キーワード」やタグ | 過去の各時点のデータが持つ「投薬」「検査」「バイタル」といったラベル |
| バリュー (V) | キーワードが一致した本の「中身そのもの」 | 「降圧薬Aを開始」「クレアチニン値1.8」「心拍数95」といった具体的な情報 |
つまり、自己注意機構は、ある時点の情報(クエリ)が、他のすべての時点の情報(キー)とどれくらい関連があるかを計算し、その関連度(重み)に応じて、各時点の情報(バリュー)を取捨選択して集めてくる、という処理を行っているのです。
アテンション計算の3ステップ
このQKVモデルを使った計算は、大きく分けて以下の3つのステップで進みます。
ステップ1:関連スコアの計算(クエリとキーの内積)
まず、「検索ワード(クエリ)」と「各本のキーワード(キー)」がどれだけ似ているかを計算します。具体的には、クエリのベクトルとすべてのキーのベクトルとの間で「内積」という計算を行います。ベクトル同士の向きが似ていれば値が大きく、異なれば小さくなるため、これによって関連性のスコアを算出できます。
この時点のスコアは、まだ正規化されていない生の数値です。
ステップ2:重みへの変換(ソフトマックス関数)
次に、ステップ1で計算した生のスコアを、合計すると1(100%)になるような「重み(Attention Weight)」に変換します。これにはソフトマックス(Softmax)関数というものが使われます。これにより、「どの時点の情報に、全体の何%の注意を割り振るか」が明確になります。料理で言えば、複数のスパイスを合計小さじ1杯になるように配分を調整するようなイメージでしょうか。
ステップ3:情報の集約(重み付き加重和)
最後に、ステップ2で計算された「重み」を、それぞれの時点の「バリュー(情報の中身そのもの)」に掛け合わせ、すべてを足し合わせます。これを加重和(Weighted Sum)と呼びます。重みが大きい時点の情報は強く反映され、重みが小さい時点の情報はほとんど無視されることになります。こうして、他のすべての時点からの情報を、重要度に応じてうまくブレンドした新しい情報ベクトルが出来上がるのです。ここが一番のキモですね。
魔法の裏側にある数式
なんだか複雑な数式が出てきましたね。でも安心してください。これは先ほどの3ステップを一つの式にまとめただけです。
\[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]
- \( QK^T \) : これがステップ1の「スコア計算」です。行列Qと行列Kの転置(T)を掛け合わせています。
- \( \sqrt{d_k} \) : スコアを \(d_k\)(キーベクトルの次元数)の平方根で割っています。これは、次元数が大きいと内積の値が大きくなりすぎる傾向があるため、それを防ぐための「スケーリング」処理です。学習を安定させるためのおまじないのようなものだと考えてください。
- \( \text{softmax}(…) \) : これがステップ2の「重みへの変換」です。
- \( …V \) : 最後に、計算された重みとバリューVを掛け合わせることで、ステップ3の「情報の集約」を行っています。

避けては通れない課題:\(O(N^2)\) の計算量
さて、この自己注意機構の仕組みを理解すると、その強力さと同時に、なぜ計算量が爆発するのかも見えてきます。問題は、スコアを計算する \(QK^T\) の部分です。
時系列の長さ(時点の数)を \(N\)、各データを表現するベクトルの次元を \(d_k\) とすると、Q、K、Vの行列のサイズ(shape)はそれぞれ `[N, d_k]` になります。このとき、スコア行列を計算する \(QK^T\) は、`[N, d_k]` の行列と `[d_k, N]` の行列の掛け算になります。

結果として、`[N, N]` というサイズの巨大な行列が生まれます。つまり、時系列の長さ\(N\)の2乗に比例して計算量が膨れ上がってしまうのです。これが \(O(N^2)\) 問題の正体です。
例えば、ICUで1分ごとにバイタルを1日(1440分)記録した場合、\(N=1440\)となり、\(N^2\)は約200万にもなります。これが数週間、数ヶ月となると、計算量は天文学的になり、現実的な時間で学習を終えることが極めて困難になります。
このように、自己注意機構は「すべての時点を公平に見る」という強力な能力と引き換えに、「すべての組み合わせを律儀に計算する」という非効率さを併せ持っています。このトレードオフをどう解決していくか。それこそが、次のセクションで紹介するInformerやAutoformerといった新しいモデルたちが挑戦した課題なのです。
T8.2 詳細:計算量の壁を打ち破る、効率的なTransformerたち
T8.1で見た\(O(N^2)\)の問題、なかなか手強い壁に感じられたかもしれませんね。実際に、この計算量の問題は、Transformerを長い時系列データに応用する上での大きなハードルでした。しかし、AI研究の世界は日進月歩です。この課題を乗り越えるため、世界中の研究者たちが知恵を絞り、数々の独創的なモデルを生み出してきました。ここではその中でも特に画期的で、後の研究に大きな影響を与えた2つのモデル、「Informer」と「Autoformer」について、その仕組みをもう少し詳しく見ていきましょう。
Informer:「本当に重要な情報」だけを賢く見抜く(2)
Informerの根底にあるのは、「すべての時点が同じくらい重要なわけではない」という、非常にシンプルかつ強力な洞察です。自己注意機構のスコア計算では、結果的にほとんど影響を与えない(アテンションの重みがほぼゼロになる)組み合わせが大多数を占めることがあります。これを「アテンションのスパース性(疎性)」と呼びます。Informerは、この無駄な計算を根本から省略しよう、というアプローチを取ります。
そのための核心技術が「ProbSparse Self-Attention(確率的スパース自己注意)」です。
ProbSparse Self-Attentionの仕組み
これは、本格的なアテンション計算に入る前に、各クエリ(Query)にとって「どのキー(Key)が重要そうか」を効率的にサンプリングする仕組みです。すべてのキーと律儀に比較するのではなく、少数の「選抜メンバー」だけを相手にするわけです。これにより、計算量を \(O(N^2)\) から \(O(N \log N)\) へと劇的に削減することに成功しました。
標準的な自己注意機構とProbSparse自己注意機構の計算イメージを比較すると、その違いは一目瞭然です。
Informerを支えるその他の工夫
Informerの凄さはこれだけではありません。長い系列を効率的に扱うため、他にもいくつかの工夫が凝らされています。
| 工夫 | 概要 | 目的 |
|---|---|---|
| Attention Distilling | アテンション層を通過するごとに、畳み込み(1D-CNN)を用いて系列長を半分に「蒸留」していく。 | 層が深くなるにつれて情報の解像度を粗くし、計算負荷とメモリ使用量を削減する。重要な情報だけを凝縮するイメージ。 |
| Generative Decoder | 未来の値を1点ずつではなく、一度にまとめて(one-shotで)生成する。 | RNNベースのデコーダで起こりがちな、予測が積み重なることによる誤差の蓄積を防ぎ、高速に長期予測を生成する。 |
これらの合わせ技によって、Informerは当時の最高性能を達成し、「長い時系列予測」という分野におけるTransformerの可能性を大きく切り拓きました。
Autoformer:「周期性」に着目した全く新しいアプローチ(3)
Informerが自己注意機構を「効率化」するアプローチだったのに対し、Autoformerは「自己注意機構そのものを、別の仕組みに置き換える」という、さらに大胆な発想転換を行いました。
多くの時系列データ、特に医療データには「周期性(Seasonality)」が存在します。心拍や呼吸の周期もそうですし、1日単位、1週間単位で変動する生活習慣データなども挙げられます。Autoformerは、この周期性こそが未来を予測する鍵だと考えました。
系列全体で相関を見る「自己相関メカニズム」
Autoformerが導入したのが、自己相関(Auto-Correlation)メカニズムです。これは、ある時点と別の時点という「点同士」の関係を見る自己注意機構とは異なり、「系列全体」と「時間をずらした系列全体」がどれだけ似ているか、という「系列同士」の関係を見ます。
例えば、今日の気温データ系列は、おそらく1日前の系列よりも、365日前の系列とよく似ていますよね。この「ラグ(ずらし幅)を変えながら相関を計算する」ことで、データに潜む支配的な周期を見つけ出すのです。この計算は、周波数領域で行うことで極めて高速に実行できるため、計算量を \(O(N \log N)\) に抑えることができます。
このアプローチに加え、Autoformerは古典的な時系列解析の考え方を取り入れ、データをまず長期的な「傾向(Trend)」と周期的な「季節性(Seasonality)」に分解します。そして、自己相関メカニズムは主に季節性成分の予測に、より単純なモデルが傾向成分の予測に責任を持つという、役割分担を行っています。
まとめ:アプローチの違い
ここまで見てきたように、InformerとAutoformerは、同じ課題に対して異なる哲学で解決を試みています。
| モデル | 中心的なアイデア | 計算量 | 得意なこと |
|---|---|---|---|
| 標準Transformer | すべての時点間の関係性を計算(密なアテンション) | \(O(N^2)\) | 短期~中期系列で、複雑な関係性を捉える |
| Informer | アテンション計算を重要な部分に限定(疎なアテンション) | \(O(N \log N)\) | スパースな関係性を持つ、非常に長い系列の予測 |
| Autoformer | 系列全体の周期性に基づく相関を計算(自己相関) | \(O(N \log N)\) | 明確な周期性を持つ系列の、長期的な予測 |
これらの理論的な進化は、研究の世界に大きなインパクトを与えました。しかし、理論的に優れているからといって、そのままノイズが多く複雑な医療現場のデータに適用できるとは限りません。次の章では、こうした理論的発展を踏まえ、より実践的な医療データへの応用を目指して開発された「PatchTST」というモデルを見ていくことにしましょう。
T8.3:医療データへの応用を見据えた PatchTST(4)
InformerやAutoformerが、Transformerの計算エンジンそのものに改良を加えることで性能を向上させたのに対し、今回ご紹介するPatchTST (Patch Time Series Transformer) は、全く異なる角度からこの問題にアプローチします。その発想は、「Transformerへの入力形式を変えれば良いのではないか?」という、シンプルながらも非常に強力なものでした。
この考え方は、実はAIの別の分野、特にコンピュータビジョン(画像認識)から大きな着想を得ています。私たちが臨床でX線写真やCT画像を読影する際、個々のピクセル(画素)を見ているわけではなく、解剖学的な構造や病変の「かたまり」として認識していますよね。PatchTSTは、この考え方を時系列データに応用したのです。
発想の転換:「点」から「パッチ(かたまり)」へ
PatchTSTの核心は、その名の通り、時系列を個々の「点(ポイント)」として扱うのではなく、ある程度の長さを持つ「パッチ(patch)」という部分系列のかたまりとして扱う点にあります。論文の原題である “A Time Series is Worth 64 Words” (4) は、このアイデアを端的に表しています。なんだか面白いタイトルですよね。これは、自然言語処理で文章を「単語」の列として扱うように、時系列を「パッチ」の列として扱おう、という宣言なのです。
この「パッチ化」のプロセスは、言葉で聞くより、図で見た方が直感的かと思います。百聞は一見に如かず、ですね。具体的な時系列データを例に、その処理の流れを追ってみましょう。
【図解:時系列のパッチ化プロセス】
上の図が示しているように、まず連続したデータを決まった長さ(\(P\))のかたまりに分割します。そして、ここが重要なのですが、分割された各パッチ(例えば \([x₁, x₂, x₃, x₄]\) という4つの数値のリスト)は、エンベディングという処理を経て、Transformerが扱える一個の「トークン(ベクトル)」に変換されます。専門用語が出てきましたが、これは単に「数値の集まりを、意味を凝縮した一個の表現に変換する処理」だと考えてください。
この結果、何が起きるでしょうか。元の入力系列の長さは \(N\) でしたが、Transformerが実際に処理する系列の長さは、パッチの数である \(L = N/P\) へと大幅に短縮されます。自己注意機構の計算量が系列長の2乗、つまり\(O(L^2)\) になることを思い出してください。パッチ化によって、計算量は \(O(N^2)\) から \(O((N/P)^2)\) へと劇的に削減されるのです。ここがPatchTSTの巧妙な点であり、長い時系列データを効率的に扱うための鍵となっています。
なぜ「パッチ化」が医療データに有効なのか?
ここまで、PatchTSTが時系列を「パッチ」として扱うことで、Transformerの計算負荷を賢く軽減していることを見てきました。でも、このアプローチの真の価値は、単なる計算量の削減に留まりません。実は、この「パッチ化」という考え方そのものが、ノイズが多く複雑な医療データが持つ特有の性質と、驚くほど相性が良いのです。私自身、この点にこそPatchTSTの大きな魅力を感じています。主な利点を2つ、深掘りしてみましょう。
1. ノイズに対する頑健性(Robustness)
皆さんがICUや病棟でリアルタイムのモニタリングデータと向き合う場面を想像してみてください。患者さんの体動、センサーの一時的な接触不良、電気的な干渉など、医療の現場で得られる生データには、どうしてもノイズが付きまといます。これは避けられない現実ですよね。
もしAIが個々のデータ「点」だけを見ていると、こうした一瞬の外れ値やノイズに過敏に反応してしまい、誤ったアラートを発したり、予測が不安定になったりする原因になり得ます。これでは、臨床現場で安心して使うことは難しいでしょう。
ここで「パッチ化」が活きてきます。ある程度の区間(パッチ)を一つの単位として扱うことで、個々の点のランダムなノイズは、パッチの中で自然に平均化・平滑化されます。結果として、モデルはより本質的なデータの動き、つまり「信号」の部分に集中できるようになるのです。これは、一回一回の血圧測定値の揺れに一喜一憂するのではなく、5分間や15分間の移動平均を見て全体的な傾向を判断する、という私たちの臨床的な思考プロセスにも似ていますね。
2. 局所的な意味情報(Local Semantics)の獲得
こちらの利点は、さらに医療AIとしての本質に迫るものだと私は考えています。時系列データ、特に心電図(ECG)や連続血糖測定(CGM)のような波形データにおいて、臨床的な意味を持つのは個々の点の値そのものよりも、むしろ部分的な「形状」や「パターン」です。
例えば、心電図を読むとき、私たちは一つ一つの点の電位を追うのではなく、「P波の立ち上がり」「QRS群の幅」「ST部分の上昇・下降」といった、意味のある波形の「かたまり」として解釈しています。PatchTSTは、この臨床医の思考プロセスを模倣するかのように、時系列から意味のある「形状」を自然に切り出して学習するのです。
これにより、モデルの学習対象が大きく変わります。
- 従来モデル:個々の血糖値の「点」と「点」の間の、微視的な関係性を学習する。
- PatchTST:「朝食後の血糖上昇パターン(パッチ)」と「運動による血糖降下パターン(パッチ)」という、より臨床的で高次の概念(=意味のあるかたまり)同士の関係性を学習する。
このように、学習の単位が「点」から「意味のある形状」へと変わることで、モデルはより頑健で、解釈可能性の高い予測を行うことができるようになります。これは、AIの判断根拠を理解することが極めて重要な医療分野において、計り知れないメリットと言えるでしょう。
応用例:多変数時系列予測と「チャンネル独立性」
さて、ここまでの話は主に一本の時系列データ(単変数)を追いかけるものでした。しかし、実際の臨床現場、特にICUのような環境では、心拍数、血圧、呼吸数、SpO2といった多数のバイタルサインを同時にモニタリングしています。これら複数の変数が、互いにどのように影響し合って未来の状態を形作っていくのか——。これを解き明かすのが、多変数(Multivariate)時系列予測のタスクであり、医療AIが真価を発揮する場面の一つです。
PatchTSTがこの難しいタスクで高い性能を発揮する背景には、そのユニークな設計思想であるチャンネル独立性(Channel-Independence)があります。
チャンネル独立性とは何か?
少し技術的な響きのある言葉ですが、考え方はとても理にかなっています。「チャンネル」とは、ここでは個々の変数(心拍数、血圧など)のことだと思ってください。チャンネル独立性とは、「まず各変数の特徴を個別に学習し、その後に変数間の関係性を学習する」という、二段階の戦略を取ることです。
従来のモデルの中には、最初からすべての変数の情報を混ぜ合わせて処理しようとするものもありました。しかし、心拍数の変動パターンと呼吸数のそれとでは、尺度も周期も全く異なります。これらをいきなり混ぜてしまうと、モデルが混乱し、それぞれのチャンネルに固有の重要なパターンをうまく学習できない可能性がありました。
PatchTSTは、この問題を次のように解決します。
- ステップ1(チャンネル内学習): まず、心拍数は心拍数だけで、血圧は血圧だけで、それぞれ独立してパッチ化とエンベディングを行います。これにより、モデルはまず「心拍数らしい波形のパターン」や「血圧らしい変動の仕方」といった、各チャンネル固有の「言語」を学びます。
- ステップ2(チャンネル間学習): 次に、各チャンネルから得られたすべてのパッチトークンをまとめてTransformerに入力します。すると、自己注意機構が、チャンネルの垣根を越えて「2つ前の心拍数パッチの上昇が、1つ前の呼吸数パッチの乱れと関連し、次の血圧パッチの低下に繋がりそうだ」といった、変数間の複雑な相互作用を自動的に見つけ出してくれるのです。
この「個別の特徴を尊重し、その上で全体の関連性を捉える」というアプローチが、多変数データの解析において非常に有効に機能します。
Python実践:多変数データのパッチ化
このチャンネル独立のパッチ化が、コード上ではどのように行われるのか、簡単なサンプルで見てみましょう。ここでは3つの変数を持つ時系列データを考えます。
【実行前の準備】以下のコードで日本語のグラフを表示させるには、あらかじめターミナルやコマンドプロンプトでpip install japanize-matplotlibを実行してライブラリをインストールしてください。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
def create_multivariate_patches(data, patch_length, stride):
"""
多変数時系列データから、チャンネル独立でパッチを作成する関数。
Args:
data (np.array): (系列長, チャンネル数) の形状を持つnumpy配列。
patch_length (int): 1パッチあたりのデータ点の数。
stride (int): パッチを切り出すスライド幅。
Returns:
np.array: (パッチ数, チャンネル数, パッチ長) の形状を持つパッチ配列。
"""
n_timesteps, n_channels = data.shape
patches = []
# 開始位置をスライドさせながらパッチを切り出す
for i in range(0, n_timesteps - patch_length + 1, stride):
# 各チャンネルから独立してパッチを切り出す
patch_group = data[i : i + patch_length, :]
patches.append(patch_group)
# (パッチ数, パッチ長, チャンネル数) -> (パッチ数, チャンネル数, パッチ長) に軸を入れ替え
# この形式の方が、後続の処理でチャンネルごとに扱いやすい
return np.array(patches).transpose(0, 2, 1)
# 1. サンプルデータを作成 (100時点, 3チャンネル)
np.random.seed(0)
time = np.arange(100)
# 各チャンネルで異なる周期とノイズを持つデータを模擬
hr = 70 + 10 * np.sin(time / 5) + np.random.randn(100) * 2
bp = 120 + 15 * np.sin(time / 10 + np.pi) + np.random.randn(100) * 3
rr = 18 + 5 * np.sin(time / 3) + np.random.randn(100) * 1
# pandas DataFrameにまとめる
df = pd.DataFrame({'心拍数': hr, '血圧': bp, '呼吸数': rr})
# 2. パラメータを設定
PATCH_LENGTH = 16 # 1パッチの長さ
STRIDE = 8 # スライド幅
# 3. 多変数データをnumpy配列に変換してパッチを作成
multivariate_data = df.values
patches_data = create_multivariate_patches(multivariate_data, PATCH_LENGTH, STRIDE)
# 4. 結果の確認
print(f"元のデータ形状: {multivariate_data.shape}")
print(f"作成されたパッチの形状: {patches_data.shape}")
# -> (パッチ数, チャンネル数, パッチ長) = (11, 3, 16)
# 5. 元データを可視化
df.plot(subplots=True, figsize=(10, 6), title='模擬バイタルサインデータ(多変数)')
plt.xlabel("時間")
plt.tight_layout()
plt.show()

元のデータ形状: (100, 3)
作成されたパッチの形状: (11, 3, 16)
このコードが示しているように、まず各変数(チャンネル)の時系列が用意され、それらがチャンネルの独立性を保ったままパッチへと変換されます。最終的な出力形状 (11, 3, 16) は、「16点ずつのデータを持つパッチが、3つのチャンネルそれぞれに対して11個ずつ作成された」ことを意味しています。この後、各パッチがエンベディングされ、Transformerへと入力されるわけです。
このようにアーキテクチャは驚くほどシンプルでありながら、チャンネル独立性という理にかなったアプローチを取ることで、PatchTSTは非常に高い性能を達成しています。この特性が、PatchTSTを医療時系列データ解析における有力な選択肢の一つにしていると言えるでしょう。
理解度チェック
学んだ内容を簡単なクイズで確認してみましょう。
- 標準的なTransformerの自己注意機構が、非常に長い時系列データの扱いに不向きな主な理由は何ですか?
a) 長期的な依存関係を学習できないから
b) 計算量が系列長の2乗で増加するから
c) 周期的なパターンを捉えられないから - 計算量問題を解決するために、Informerモデルが導入した主要な工夫は何ですか?
a) 系列をトレンドと季節性に分解する
b) 注目すべき計算を重要な部分に限定する(スパース化)
c) 畳み込みニューラルネットワーク(CNN)を組み合わせる - PatchTSTモデルが他の時系列Transformerと異なる、最も特徴的なアプローチは何ですか?
a) 自己注意機構を完全に撤廃したこと
b) RNNを組み合わせて短期記憶を補強したこと
c) 時系列を「パッチ」という部分的なセグメントに分割して入力すること
(答え: 1-b, 2-b, 3-c)
まとめ:Transformerが拓く医療時系列解析の未来
今回は、時系列解析におけるTransformerの応用について、その基本である自己注意機構から、計算量問題を克服したInformerやAutoformer、そして医療応用で有望なPatchTSTまでを駆け足で概観しました。
- 自己注意機構は、データ点間の長期的な関連性を捉える強力なツールです。
- 計算量の課題は、InformerやAutoformerのような効率的なアーキテクチャによって克服されつつあります。
- PatchTSTは、時系列を「パッチ」として扱うことで、医療データのようなノイズが多く複雑なデータへの応用を現実的なものにしました。
これらの技術は、患者さんの予後予測、異常検知、治療効果判定など、医療AIの精度を飛躍的に向上させる可能性を秘めています。
今後の記事では、T8.1からT8.3の各トピックについて、より詳細なアルゴリズムの解説や、実際の医療データ(MIMIC-IVなど)を用いたPythonでの実装ハンズオンを予定しています。ご期待ください。
参考文献
- Vaswani A, Shazeer N, Parmar N, Uszkoreit J, Jones L, Gomez AN, et al. Attention is all you need. In: Advances in Neural Information Processing Systems 30. Curran Associates, Inc.; 2017. p. 5998-6008.
- Zhou H, Zhang S, Peng J, Zhang S, Li J, Xiong H, et al. Informer: Beyond efficient transformer for long sequence time-series forecasting. In: Proceedings of the AAAI Conference on Artificial Intelligence. 2021;35(12):11106-11115.
- Wu H, Xu J, Wang J, Long M. Autoformer: Decomposition transformers with auto-correlation for long-term series forecasting. In: Advances in Neural Information Processing Systems 34. Curran Associates, Inc.; 2021. p. 22419-22430.
- Nie Y, Nguyen NH, Sinthong P, Kalagnanam J. A time series is worth 64 words: Long-term forecasting with transformers. In: International Conference on Learning Representations. 2023.
ご利用規約(免責事項)
当サイト(以下「本サイト」といいます)をご利用になる前に、本ご利用規約(以下「本規約」といいます)をよくお読みください。本サイトを利用された時点で、利用者は本規約の全ての条項に同意したものとみなします。
第1条(目的と情報の性質)
- 本サイトは、医療分野におけるAI技術に関する一般的な情報提供および技術的な学習機会の提供を唯一の目的とします。
- 本サイトで提供されるすべてのコンテンツ(文章、図表、コード、データセットの紹介等を含みますが、これらに限定されません)は、一般的な学習参考用であり、いかなる場合も医学的な助言、診断、治療、またはこれらに準ずる行為(以下「医行為等」といいます)を提供するものではありません。
- 本サイトのコンテンツは、特定の製品、技術、または治療法の有効性、安全性を保証、推奨、または広告・販売促進するものではありません。紹介する技術には研究開発段階のものが含まれており、その臨床応用には、さらなる研究と国内外の規制当局による正式な承認が別途必要です。
- 本サイトは、情報提供を目的としたものであり、特定の治療法を推奨するものではありません。健康に関するご懸念やご相談は、必ず専門の医療機関にご相談ください。
第2条(法令等の遵守)
利用者は、本サイトの利用にあたり、医師法、医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律(薬機法)、個人情報の保護に関する法律、医療法、医療広告ガイドライン、その他関連する国内外の全ての法令、条例、規則、および各省庁・学会等が定める最新のガイドライン等を、自らの責任において遵守するものとします。これらの適用判断についても、利用者が自ら関係各所に確認するものとし、本サイトは一切の責任を負いません。
第3条(医療行為における責任)
- 本サイトで紹介するAI技術・手法は、あくまで研究段階の技術的解説であり、実際の臨床現場での診断・治療を代替、補助、または推奨するものでは一切ありません。
- 医行為等に関する最終的な判断、決定、およびそれに伴う一切の責任は、必ず法律上その資格を認められた医療専門家(医師、歯科医師等)が負うものとします。AIによる出力を、資格を有する専門家による独立した検証および判断を経ずに利用することを固く禁じます。
- 本サイトの情報に基づくいかなる行為によって利用者または第三者に損害が生じた場合も、本サイト運営者は一切の責任を負いません。実際の臨床判断に際しては、必ず担当の医療専門家にご相談ください。本サイトの利用によって、利用者と本サイト運営者の間に、医師と患者の関係、またはその他いかなる専門的な関係も成立するものではありません。
第4条(情報の正確性・完全性・有用性)
- 本サイトは、掲載する情報(数値、事例、ソースコード、ライブラリのバージョン等)の正確性、完全性、網羅性、有用性、特定目的への適合性、その他一切の事項について、何ら保証するものではありません。
- 掲載情報は執筆時点のものであり、予告なく変更または削除されることがあります。また、技術の進展、ライブラリの更新等により、情報は古くなる可能性があります。利用者は、必ず自身で公式ドキュメント等の最新情報を確認し、自らの責任で情報を利用するものとします。
第5条(AI生成コンテンツに関する注意事項)
本サイトのコンテンツには、AIによる提案を基に作成された部分が含まれる場合がありますが、公開にあたっては人間による監修・編集を経ています。利用者が生成AI等を用いる際は、ハルシネーション(事実に基づかない情報の生成)やバイアスのリスクが内在することを十分に理解し、その出力を鵜呑みにすることなく、必ず専門家による検証を行うものとします。
第6条(知的財産権)
- 本サイトを構成するすべてのコンテンツに関する著作権、商標権、その他一切の知的財産権は、本サイト運営者または正当な権利を有する第三者に帰属します。
- 本サイトのコンテンツを引用、転載、複製、改変、その他の二次利用を行う場合は、著作権法その他関連法規を遵守し、必ず出典を明記するとともに、権利者の許諾を得るなど、適切な手続きを自らの責任で行うものとします。
第7条(プライバシー・倫理)
本サイトで紹介または言及されるデータセット等を利用する場合、利用者は当該データセットに付随するライセンス条件および研究倫理指針を厳格に遵守し、個人情報の匿名化や同意取得の確認など、適用される法規制に基づき必要とされるすべての措置を、自らの責任において講じるものとします。
第8条(利用環境)
本サイトで紹介するソースコードやライブラリは、執筆時点で特定のバージョンおよび実行環境(OS、ハードウェア、依存パッケージ等)を前提としています。利用者の環境における動作を保証するものではなく、互換性の問題等に起因するいかなる不利益・損害についても、本サイト運営者は責任を負いません。
第9条(免責事項)
- 本サイト運営者は、利用者が本サイトを利用したこと、または利用できなかったことによって生じる一切の損害(直接損害、間接損害、付随的損害、特別損害、懲罰的損害、逸失利益、データの消失、プログラムの毀損等を含みますが、これらに限定されません)について、その原因の如何を問わず、一切の法的責任を負わないものとします。
- 本サイトの利用は、学習および研究目的に限定されるものとし、それ以外の目的での利用はご遠慮ください。
- 本サイトの利用に関連して、利用者と第三者との間で紛争が生じた場合、利用者は自らの費用と責任においてこれを解決するものとし、本サイト運営者に一切の迷惑または損害を与えないものとします。
- 本サイト運営者は、いつでも予告なく本サイトの運営を中断、中止、または内容を変更できるものとし、これによって利用者に生じたいかなる損害についても責任を負いません。
第10条(規約の変更)
本サイト運営者は、必要と判断した場合、利用者の承諾を得ることなく、いつでも本規約を変更することができます。変更後の規約は、本サイト上に掲載された時点で効力を生じるものとし、利用者は変更後の規約に拘束されるものとします。
第11条(準拠法および合意管轄)
本規約の解釈にあたっては、日本法を準拠法とします。本サイトの利用および本規約に関連して生じる一切の紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とします。
For J³, may joy follow you.

