【極めればこのテンソル操作 】tensor.unsqueeze(0)と array[None] の違い

【極めればこのテンソル操作 】tensor.unsqueeze(0)と array[None] の違い
Photo by Merve Sehirli Nasir / Unsplash

今日は、 unsqueeze(0) の解説しつつ、私たちがよく直面する「あるある」な問題についてもちょこっと話してみたいと思います。

「value.unsqueeze(0)」と「value[None]」 の見分けついていますか?


はい、前者は主に PyTorch、後者は NumPyでの操作の違いです。

でもどちらも、ぱっとみは、先頭に新しく次元を追加する操作なので、コードをちらっとみただけではわからないことがありますよね。

なぜかというと、ディープラーニング系のプログラミングでは PyTorchのテンソルと、NumPyの配列操作がかなり入り混じるからです。

そう、今日の話題はPyTorchとNumPyのコードが入り乱れて、どっちの配列(テンソル)を扱っているのわけワカメになる問題です。

ちなみに、話題のテーマをブラさないように PyTorchでは 先頭に新しい次元を追加するときに unsqueeze(0) だけでなく [None] も使えてしまいますが、いったん[None]は NumPy で主に使用する操作という前提で説明させてくださいませ。^^;

これに対する当社なりの処方箋は、また別投稿をしたいとおもいますが、両者が無邪気に入り混じらないように、PyTorchとNumPyのコードをなるべく分離するようにしています。例えば「同一関数、メソッド内はPyTorchかNumPyに寄せる」、や、「GPU投入寸前までPyTorchテンソル化をガマンしてNumPyでがんばる」など、(涙ぐましい?)現場の工夫をしています^^

NumPy系の変数名には「なんちゃら_numpy」「なんちゃら_tensor」のようにするなど、あまりにも紛らわしいときには、行っていますが、型宣言のゆるいPythonコーディングの慣例上、同一変数名なのにNumPyからPyTorchにいつのまにか変わっていた、なんていう外部コードも大量にあり、なかなか難しいですね。

PyTorchとNumPyが入り乱れる世界 ~機械学習プロジェクトを進めていると、こんな経験ありませんか?

  • データの前処理はNumPyで行っていたのに、モデルに入力するときにはPyTorchのテンソルに変換しなければならない。
  • モデルから出力されたPyTorchのテンソルを、可視化のためにNumPy配列に戻す。
  • そして気づいたら、コード内でNumPyとPyTorchの関数が混在している...

これって、まるでプログラミング言語のバベルの塔ですよね。

今回は、PyTorchの.unsqueeze(0)メソッドとNumPyの[None]インデックスの違いについて詳しく見ていきましょう。一見似ているこれらの操作ですが、実は重要な違いがあります。

1. 基本的な違い

まず、最も基本的な違いは、冒頭でふれたとおり、

  • .unsqueeze(0): PyTorchのテンソルに使用されるメソッドです。
  • [None]: NumPy配列やPythonのリストに使用されるインデックス操作です。
    (コラムに書きましたが、実はPyTorchでも使えちゃいますが、頭に次元追加する操作は PyTorchでは unsqueeze(0)、おしりに次元追加する操作はunsqueeze(-1)でやるのが可読性や操作意図のわかりやすからオススメです)

2. 動作の詳細

.unsqueeze(0)

PyTorchの.unsqueeze(0)メソッドは、テンソルの0次元目(先頭)に新しい次元を追加します。これは、バッチ処理のためにデータを準備する際によく使用されます。1件だけのデータを学習モデルに突っ込みたいときも、「バッチ次元」を求められることが常なので unsqueeze(0) は頻発するコードだとおもいます。

import torch

x = torch.tensor([1, 2, 3])
print(x.shape)  # torch.Size([3])

x_unsqueezed = x.unsqueeze(0)
print(x_unsqueezed.shape)  # torch.Size([1, 3])

[None]

NumPyの[None]インデックスは、配列に新しい軸を追加します。これも実質的に次元を1つ増やすことになります。

例:

import numpy as np

y = np.array([1, 2, 3])
print(y.shape)  # (3,)

y_expanded = y[None]
print(y_expanded.shape)  # (1, 3)

3. 柔軟性の違い

.unsqueeze(n)メソッドは、引数nを変えることで任意の位置に次元を追加できる柔軟性があります。

例:

import torch

z = torch.tensor([[1, 2], [3, 4]])
print(z.shape)  # torch.Size([2, 2])

z_unsqueezed_0 = z.unsqueeze(0)
print(z_unsqueezed_0.shape)  # torch.Size([1, 2, 2])

z_unsqueezed_1 = z.unsqueeze(1)
print(z_unsqueezed_1.shape)  # torch.Size([2, 1, 2])

一方、[None]は常に新しい軸を先頭(axis 0)に追加します。ただし、NumPyにはnp.expand_dims()関数があり、これを使用すると任意の位置に次元を追加できます。

import numpy as np

w = np.array([[1, 2], [3, 4]])
print(w.shape)  # (2, 2)

w_expanded_0 = np.expand_dims(w, axis=0)
print(w_expanded_0.shape)  # (1, 2, 2)

w_expanded_1 = np.expand_dims(w, axis=1)
print(w_expanded_1.shape)  # (2, 1, 2)

4. パフォーマンスの考慮

一般的に、.unsqueeze()[None](またはnp.expand_dims())の間にパフォーマンスの大きな差はありません。しかし、大規模なデータセットや複雑なモデルを扱う場合、わずかな違いが積み重なって影響を与える可能性があります。

PyTorchを使用している場合は.unsqueeze()を、NumPyを使用している場合は[None]np.expand_dims()を使用するのが自然で効率的です。

まとめ ~.unsqueeze(0)[None]の実践的理解~

今回は、.unsqueeze(0)[None]の用法について詳しく解説しました。

問題の本質は、PyTorchとNumPyの混在にありますが、コードを書く上では、どちらの「世界」にいるのかを常に意識することが大切ですね。

コードを読む際には、.unsqueeze(0)が登場したら「ここからPyTorchでの次元追加だな」と考え、[None]を見たら「まだNumPyの領域にいるな」と理解するとよいでしょう。

使用シーンの違いも重要なポイントです。.unsqueeze(0)は多くの場合、1件データのモデル投入の直前に「緊急的な」次元追加として用いられます。そのため、モデル投入直前でよく目にすることになります。一方、[None]による次元追加は、通常モデル投入よりもずっと前の段階、つまりまだNumPy操作のフェーズで行われることが多いです。その後、モデル投入直前でPyTorchテンソルへの変換とGPUへの送り込みが行われるというパターンもよく見かけます。

これらの操作を見かけたら、まずは「バッチ次元追加かな?」と推測してみるのが良いでしょう。バッチ処理のニーズで使われることが多いためです。ただし、必ずしもバッチ次元の追加だけでなく、例えば画像処理ではチャンネル次元の追加に使われることもあるので、コンテキストをよく確認することが大切です。

結論として、.unsqueeze(0)[None]の違いを理解し、適切に使い分けることで、より明確で効率的なコードを書くことができます。また、これらの操作を見かけたときは「バッチ次元の追加かもしれない」と考えつつ、常にコンテキストを確認する習慣をつけることで、コードの意図をより深く理解できるようになるでしょう。

Read more

AI時代のデータ漏洩防止の要諦とテクノロジー:第1回 AI DLPとPROXY

AI時代のデータ漏洩防止の要諦とテクノロジー:第1回 AI DLPとPROXY

こんにちは!本日はAI時代のデータ漏洩防止について、とくにその通信技術面に焦点をあてつつ、AIセキュリティにどのように取り組んでいくべきか、解説いたします。 1. はじめに 生成AIの急速な普及により、企業のデータガバナンスは新たな局面を迎えています。ChatGPTやClaudeといった大規模言語モデル(LLM)は、業務効率を飛躍的に向上させる一方で、意図しない機密情報の漏洩という深刻なリスクをもたらしています。 従業員が何気なく入力した顧客情報や営業秘密が、AIサービスの学習データとして使用される可能性があることを、多くの組織はまだ十分に認識していません。従来のDLP(Data Loss Prevention)ソリューションは、メールやファイル転送を監視することには長けていましたが、リアルタイムで行われるWebベースのAIチャットやAIエージェントとの対話で発生しうる新しい脅威には対応できていないのが現状です。 本記事では、AI時代のデータ漏洩防止において中核となる技術、特にHTTPS通信のインターセプトとその限界について、技術的な観点から詳しく解説します。プロキシサーバー

By Qualiteg プロダクト開発部, Qualiteg コンサルティング
LLM推論基盤プロビジョニング講座 第5回 GPUノード構成から負荷試験までの実践プロセス

LLM推論基盤プロビジョニング講座 第5回 GPUノード構成から負荷試験までの実践プロセス

こんにちは!これまでのLLM推論基盤プロビジョニング講座では、推論速度の定義、リクエスト数見積もり、メモリ消費量計算、推論エンジン選定について詳しく解説してきました。 今回は、残りのステップである「GPUノード構成見積もり」「負荷試験」「トレードオフ検討」について一気に解説し、最後に実際のサーバー構成例をご紹介します。 STEP5:GPUノード構成見積もり GPUメモリから考える同時リクエスト処理能力 LLMサービスを構築する際、どのGPUを何台選ぶかは非常に重要な決断です。今回はLlama 8Bモデルを例に、GPUメモリ容量と同時リクエスト処理能力の関係を見ていきましょう。 GPUメモリの使われ方を理解する ここは復習となりますが、 LLM推論においてGPUメモリは主に2つの用途で消費されます 1. モデル重みデータ: LLMモデル自体を格納するためのメモリ 2. KVキャッシュ: ユーザーとの対話コンテキストを保持するための一時メモリ Llama 8Bを16ビット精度で実行する場合、モデル重みデータは約16GBのメモリを占めます。これは固定的なメモリ消

By Qualiteg コンサルティング
発話音声からリアルなリップシンクを生成する技術 第2回:AIを使ったドリフト補正

発話音声からリアルなリップシンクを生成する技術 第2回:AIを使ったドリフト補正

こんにちは! 前回の記事では、当社のMotionVoxで使用している「リップシンク」技術について、wav2vecを用いた音声特徴量抽出の仕組みを解説しました。音声から正確な口の動きを予測するための基礎技術について理解いただけたかと思います。 今回は、その続編として、リップシンク制作における重要な技術的課題である「累積ドリフト」に焦点を当てます。wav2vecで高精度な音素認識ができても、実際の動画制作では複数の音声セグメントを時系列に配置する際、わずかなタイミング誤差が蓄積して最終的に大きなずれとなる現象が発生します。 本記事では、この累積ドリフトのメカニズムと、機械学習を活用した最新の補正技術について、実際の測定データを交えながら詳しく解説していきます。前回のwav2vecによる特徴抽出と今回のドリフト補正技術を組み合わせることで、MotionVoxがどのように高品質なリップシンクを実現しているのか、その全体像が見えてくるはずです。 累積ドリフトとは何か 基本概念 累積ドリフトとは、個々の音声セグメントが持つ微小なタイミング誤差が、時間の経過とともに蓄積していく現象で

By Qualiteg 研究部
AIエージェント時代の新たな番人「ガーディアンエージェント」とは?

AIエージェント時代の新たな番人「ガーディアンエージェント」とは?

こんにちは!今日は先日ガートナーが発表したガーディアンエージェントについて解説します ガートナーの公式定義 ハイプカーブで有名なガートナーは2025年6月に、ガーディアンエージェントに関する見解を発表しました。ガーディアン・エージェントとは、AIとの安全で信頼できるやりとりを支援するために設計されたAIベースのテクノロジです。 ざっくりいうと、 「AIエージェントが来るよ」と予言したガートナー社は、次は、「ガーディアンエージェントが来るよ」と予言しました。なぜガーディアンエージェントが来るのでしょうか?本稿では、そのあたりを考察していきたいと思います。 なぜ今、AIの「監視役」が必要なのか 2025年、私たちは本格的なAIエージェント時代の入り口に立っています。AIが単なるツールから、自律的に判断し行動する「エージェント」へと進化する中で、新たな課題が浮上しています。 従来のAIとエージェント型AIの違い さて、ガーディアンエージェントが必要になる理由として、生成AI(以後AIと呼びます)の急速な進化があげられます。従来のAIとエージェント型AIの違いを思い出

By Qualiteg コンサルティング