慣性聚合 関心のあるブログ、ニュース、テクノロジーを効率的に追跡
原文を読む 慣性聚合で開く

おすすめ購読元

小众软件
小众软件
博客园 - 叶小钗
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V
Visual Studio Blog
月光博客
月光博客

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
層を増やすとモデルが悪化した時代...残差の誕生
Aviral Singh · 2026-05-28 · via DEV Community

Aviral Singh

class TinyTransformer(nn.Module):
    def __init__(self):
        super().__init__()
        # setting the constructor for the initial values that we are every gonna need for the training of the data
        self.char_embedding = nn.Embedding(65, 64)
        self.pos_embedding = nn.Embedding(64, 64)
        self.query = nn.Linear(64, 64)
        self.key = nn.Linear(64, 64)
        self.value = nn.Linear(64, 64)
        self.mask = torch.tril(torch.ones(64, 64))
        # these are for changing the dimensions we are doing this to enlarge the matrix as to make it of higher resolution so as to make the 
        # data and weights more refined 
        self.ff1 = nn.Linear(64, 128)
        # this is to join them back again 
        self.ff2 = nn.Linear(128, 64)
        self.output_head = nn.Linear(64, 65)
        self.norm1 = nn.LayerNorm(64)
        self.norm2 = nn.LayerNorm(64)
        self.out_proj = nn.Linear(64, 64)

    def forward(self, x):
        # feed forward function
        x = self.char_embedding(x) + self.pos_embedding(torch.arange(64))
        # this is the start of the attention stuff i am writing this as a way to separate the code in section inside a functions
        #
        Q = self.query(x)
        Q = Q.view(32, 64, 2, 32)
        Q = Q.transpose(1, 2)
        K = self.key(x)
        K = K.view(32, 64, 2, 32)
        K = K.transpose(1, 2)
        V = self.value(x)
        V = V.view(32, 64, 2, 32)
        V = V.transpose(1, 2)
        A = (Q @ K.transpose(-2, -1)) / 32**0.5

        A = A.masked_fill(self.mask == 0, float("-inf"))
        At = A.softmax(dim=-1)
        # the -1 this is just to tell the
        output = At @ V
        output = output.transpose(1, 2).contiguous().view(32, 64, 64)
        output = self.out_proj(output)
        # this is where the attention ends and we start with the feed forward thing that will give us the predictions
        # added another form of normalization below to improve accuracy the first time the loss function reached 1.8 max now after adding the
        # below line it reached to like 1.5 something
        x = x + output
        x = self.norm1(x)

        output = self.ff1(x)
        output = torch.relu(output)
        output = self.ff2(output)

        x = x + output  # ← merge back into main flow
        x = self.norm2(x)
        x = self.output_head(x)
        return x

フルスクリーンモードに入る フルスクリーンモードを終了

このコードは、AI分野の誰にとっても、トランスフォーマーを訓練するための基本的なボイラープレートです。

私はここにある小さな一行を理解したいだけです。その行には本当に興味深い背景があります。

 x = x + output

フルスクリーンモードに入る フルスクリーンモードを終了

なぜこれをやっているのか - X=X+output ?

ニューラルネットワークは、バックプロパゲーションのプロセスを通じて学習します。これは基本的に、フィルターを変更することで正しい予測に近づく変化を探していることを意味します。しかし、これには特定の問題があります。それは、ある層から別の層に移動するにつれて勾配がどんどん小さくなり、これは大きな問題です。なぜなら、計算もますます困難になり、計算コストも高くなるからです。これは基本的に、偏微分の連鎖律に起因します。。では、このことはどのように解決されるのでしょうか?

*この問題の歴史 *

こちらの論文を読む --

この論文はマイクロソフト研究チームによるもので、基本的には「多ければ必ずしも良いとは限らない」という問題をどのように解決したかについてです。この論文以前、深層学習モデルを訓練する際、モデルの深さ(つまり層の数)が増えるほど、エラーも増えるという大きな問題があり、人々はその解決方法を知りませんでした。なぜなら、一方ではより深い理解が得られる一方で、もう一方ではエラーが増えるという問題があったからです。

解決策

さて、私たちは解決策として、すべての計算後に得られたコンテキスト行列に元の埋め込みベクトル(私の場合)を単に追加すればよいと思うかもしれません。そう考えるのは正しいですが、その理由はあなたが考えているものとは異なります。論文自体にも、それがこの問題の理由ではないと書かれています。

私たちは、この最適化の難しさが…する可能性は低いと考えています。
勾配消失によって引き起こされます。

なぜか? - 勾配消失に対する疑念を取り除く理由は、勾配消失問題を最小化し停止するための対策が行われているからです。これらはバッチ正規化や、この場合はReLuなどの助けを借りて行われます。以下はコード内でそれを行う方法です -

    x = self.norm1(x) # the batch normalization equivalent in transformers 

    output = self.ff1(x)
    output = torch.relu(output) # another way to solve the vanishing gradient problem 
    output = self.ff2(output)

    x = x + output  # ← merge back into main flow
    x = self.norm2(x)
    x = self.output_head(x)

全画面モードに入る 全画面モードを終了する

ご覧の通り、これやそれらは勾配消失問題を解決します。しかし、もしx=x+outputの行を削除すると、結果は悪化します。試してみましょう。 --

これは通常の方法で何も変更しない場合です。次に、一箇所だけ変更します。つまり、x=x+outputの行を削除するだけです。そして、それが損失関数にどのような影響を与えるかを見てみます。

それで、損失関数はこの1行だけで1.70から2.47に跳ね上がりました。あまり大きな差に見えないかもしれませんが、これは単純化のために1層モデルであることを忘れないでください。そして、層を追加するほど誤差も大きくなります。私の主張を確固たるものにするために、ここでいくつかの小さな調整を加えることで、その勾配の動きを示したいと思います -

step 44500, loss: 2.5130
  char_embedding.weight          grad_norm: 0.006248
  pos_embedding.weight           grad_norm: 0.005838
  ff1.weight                     grad_norm: 0.024721
  ff2.weight                     grad_norm: 0.053932
  output_head.weight             grad_norm: 0.163109
  norm1.weight                   grad_norm: 0.007271
  norm2.weight                   grad_norm: 0.024594
step 45000, loss: 2.4751
  char_embedding.weight          grad_norm: 0.005574
  pos_embedding.weight           grad_norm: 0.005913
  ff1.weight                     grad_norm: 0.023506
  ff2.weight                     grad_norm: 0.056331
  output_head.weight             grad_norm: 0.161182
  norm1.weight                   grad_norm: 0.007898
  norm2.weight                   grad_norm: 0.020992
step 45500, loss: 2.4623
  char_embedding.weight          grad_norm: 0.006224
  pos_embedding.weight           grad_norm: 0.006075
  ff1.weight                     grad_norm: 0.025461
  ff2.weight                     grad_norm: 0.051210
  output_head.weight             grad_norm: 0.145062
  norm1.weight                   grad_norm: 0.008452
  norm2.weight                   grad_norm: 0.018521
step 46000, loss: 2.4764
  char_embedding.weight          grad_norm: 0.006709
  pos_embedding.weight           grad_norm: 0.006148
  ff1.weight                     grad_norm: 0.026940
  ff2.weight                     grad_norm: 0.057071
  output_head.weight             grad_norm: 0.163159
  norm1.weight                   grad_norm: 0.008988
  norm2.weight                   grad_norm: 0.025112
step 46500, loss: 2.4746
  char_embedding.weight          grad_norm: 0.006127
  pos_embedding.weight           grad_norm: 0.006181
  ff1.weight                     grad_norm: 0.025931
  ff2.weight                     grad_norm: 0.056799
  output_head.weight             grad_norm: 0.158272
  norm1.weight                   grad_norm: 0.008369
  norm2.weight                   grad_norm: 0.025981

全画面モードに入る フルスクリーンモードを終了

さて、ここで私が言っていたのは、これが勾配消失問題を解決するように見えるけれど、実際には全く解決していないということです。
実際にこれが行っているのは、もっとずっと興味深いことなのです。-
すべての層と非線形は何らかの変更を行い、これらの変更は非常に速く複合的に積み重なります。そして、約20層の場合、たとえ層数が多いとしても機能するかもしれません。しかし、ここから50層のようなものに移行すると、複雑さはさらに急増します。これらの「小さな」変更は、それ自体が非常に小さくても値を大きく変える可能性があり、その結果生じる値は元の値とはまったく異なるものになるかもしれません。例を挙げると -
5, 3, 8 --->5, 3, 8--->0.3, 0.01, 0.2 そして、これらは勾配消失のようなものによるものではなく、その間に行う小さな変更によるものであることに気づきます。では、これに元のものを追加するとどうなるでしょうか? -
[5, 3, 8] + [0.3, 0.01, 0.2] = [5.3, 3.01, 8.2]
それで、この結果は元のものに非常に近いですよね?それが残差の主な考え方です。他にも多くの残差アルゴリズムがありますが、簡単のため、昔ながらの加算に固執します。率直に言って、この方が良いのです。