<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Meclin A Francis</title>
    <description>The latest articles on DEV Community by Meclin A Francis (@meclin).</description>
    <link>https://dev.to/meclin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2908383%2F23b7ea7c-0af7-4d92-b406-7ff524c8fd76.jpg</url>
      <title>DEV Community: Meclin A Francis</title>
      <link>https://dev.to/meclin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/meclin"/>
    <language>en</language>
    <item>
      <title>PyTorch from Scratch — Part 1: Tensors, Gradients &amp; Activations</title>
      <dc:creator>Meclin A Francis</dc:creator>
      <pubDate>Sat, 06 Jun 2026 14:19:08 +0000</pubDate>
      <link>https://dev.to/meclin/pytorch-from-scratch-part-1-tensors-gradients-activations-24o4</link>
      <guid>https://dev.to/meclin/pytorch-from-scratch-part-1-tensors-gradients-activations-24o4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Most people use PyTorch without really knowing what's happening underneath. This series breaks the foundations down into the simplest possible explanations — one concept at a time, with code you can run and exactly what goes in and comes out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is &lt;strong&gt;Part 1 of 5&lt;/strong&gt;. By the end you'll understand the five building blocks every neural network is made of: creating tensors, doing math on them, reshaping them, computing gradients, and bending them with activation functions.&lt;/p&gt;

&lt;p&gt;No assumed knowledge. Let's go.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What a tensor actually is
&lt;/h2&gt;

&lt;p&gt;Everything in deep learning is built from one object: the &lt;strong&gt;tensor&lt;/strong&gt;. Don't let the name scare you — a tensor is just a &lt;strong&gt;box of numbers&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 number → a &lt;strong&gt;scalar&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a row of numbers → a &lt;strong&gt;vector&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a grid → a &lt;strong&gt;matrix&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;stacked grids → a &lt;strong&gt;tensor&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An image is literally a 3D tensor: &lt;code&gt;height × width × colour&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The first skill is creating them — filled with zeros, ones, or any value you want. Then &lt;code&gt;.tolist()&lt;/code&gt; reads the tensor back as a plain Python list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zeros&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ones&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                       &lt;span class="c1"&gt;# "full"
&lt;/span&gt;        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;full&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What goes in and what comes out:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create_tensor("zeros", [2, 3])        -&amp;gt; [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
create_tensor("full", [2, 2], 7.0)    -&amp;gt; [[7.0, 7.0], [7.0, 7.0]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Gotcha:&lt;/strong&gt; a function only hands back a value if you write &lt;code&gt;return&lt;/code&gt;. Forget it and your function silently returns &lt;code&gt;None&lt;/code&gt; — one of the most common beginner bugs.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Doing math on tensors
&lt;/h2&gt;

&lt;p&gt;There are two kinds of math you'll use constantly, and mixing them up is the #1 beginner mistake.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Element-wise&lt;/strong&gt; — same position meets same position. &lt;code&gt;[1, 2, 3] + [4, 5, 6] = [5, 7, 9]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matrix multiplication (&lt;code&gt;@&lt;/code&gt;)&lt;/strong&gt; — rows × columns. This one &lt;em&gt;mixes&lt;/em&gt; values together, and it's the single most-used operation in all of deep learning. Every layer of every model is a matmul.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tensor_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;add&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;multiply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;matmul&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;power&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                       &lt;span class="c1"&gt;# "max"
&lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;maximum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Input → output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tensor_op([1,2,3], [4,5,6], "add")              -&amp;gt; [5.0, 7.0, 9.0]
tensor_op([[1,2],[3,4]], [[5,6],[7,8]], "matmul") -&amp;gt; [[19.0, 22.0], [43.0, 50.0]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Two traps:&lt;/strong&gt; &lt;code&gt;*&lt;/code&gt; is element-wise multiply, &lt;code&gt;@&lt;/code&gt; is matrix multiply — completely different operations. And for the element-wise maximum of two tensors, use &lt;code&gt;torch.maximum(a, b)&lt;/code&gt;, &lt;strong&gt;not&lt;/strong&gt; Python's built-in &lt;code&gt;max()&lt;/code&gt; (that one can't compare tensors position-by-position).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Reshaping tensors
&lt;/h2&gt;

&lt;p&gt;Reshaping means: &lt;strong&gt;same numbers, new shape.&lt;/strong&gt; The data never changes — only how it's arranged. This matters because data arrives in one shape and the next layer expects another. Reshaping is the quiet glue holding a network together.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flatten&lt;/code&gt; → squash a grid into a single line&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;squeeze&lt;/code&gt; → drop useless size-1 dimensions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transpose&lt;/code&gt; (&lt;code&gt;.T&lt;/code&gt;) → flip rows and columns
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reshape_tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;flatten&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;squeeze&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;squeeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                       &lt;span class="c1"&gt;# "transpose"
&lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Input → output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reshape_tensor([[1,2,3],[4,5,6]], "flatten")   -&amp;gt; [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
reshape_tensor([[1,2],[3,4]], "transpose")     -&amp;gt; [[1.0, 3.0], [2.0, 4.0]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Gotcha:&lt;/strong&gt; &lt;code&gt;else&lt;/code&gt; is a catch-all — it never takes a condition. Writing &lt;code&gt;else op == "transpose":&lt;/code&gt; is a syntax error. Just &lt;code&gt;else:&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Autograd — the engine that trains everything
&lt;/h2&gt;

&lt;p&gt;This is the most important idea in deep learning, and PyTorch does the hard part for you.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;gradient&lt;/strong&gt; is just a slope. It answers one question: &lt;em&gt;"if I nudge this input a little, does the output go up or down, and how steeply?"&lt;/em&gt; That slope is what tells a network which direction to adjust its weights to reduce its error.&lt;/p&gt;

&lt;p&gt;The trick: mark a tensor with &lt;code&gt;requires_grad=True&lt;/code&gt;, do your math, then call &lt;code&gt;.backward()&lt;/code&gt;. PyTorch quietly records every operation and computes all the slopes automatically — no calculus by hand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compute_gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requires_grad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;      &lt;span class="c1"&gt;# collapse to a single number
&lt;/span&gt;    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backward&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                &lt;span class="c1"&gt;# walk backward, fill in the slopes
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grad&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Input → output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;compute_gradient([1, 2, 3])    -&amp;gt; [5.0, 14.0, 29.0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why those numbers? The slope of &lt;code&gt;x³ + 2x&lt;/code&gt; is &lt;code&gt;3x² + 2&lt;/code&gt;. At &lt;code&gt;x = 1&lt;/code&gt; that's &lt;code&gt;3(1) + 2 = 5&lt;/code&gt;. At &lt;code&gt;x = 2&lt;/code&gt; it's &lt;code&gt;3(4) + 2 = 14&lt;/code&gt;. PyTorch produced the exact analytical answer — automatically. That's the whole point: it works even for equations far too big to differentiate by hand.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Two gotchas:&lt;/strong&gt; &lt;code&gt;requires_grad&lt;/code&gt; needs floats (integers can't track gradients), and &lt;code&gt;.backward()&lt;/code&gt; must start from a single number — that's why we call &lt;code&gt;.sum()&lt;/code&gt; first.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Activation functions — adding the bend
&lt;/h2&gt;

&lt;p&gt;Here's a surprising fact: if you stack layers that each compute &lt;code&gt;weight × input + bias&lt;/code&gt;, the whole stack collapses into a single straight line — even if it's a hundred layers deep. A straight line can't model faces, language, or anything interesting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activation functions&lt;/strong&gt; fix this by adding a &lt;em&gt;bend&lt;/em&gt; (a "nonlinearity") after each layer. That bend is what lets a network learn curves and complex patterns.&lt;/p&gt;

&lt;p&gt;The common ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ReLU&lt;/strong&gt; → cut off negatives: &lt;code&gt;max(0, x)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sigmoid&lt;/strong&gt; → squash any number into &lt;code&gt;0…1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tanh&lt;/strong&gt; → squash into &lt;code&gt;−1…1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LeakyReLU&lt;/strong&gt; → like ReLU, but lets a tiny bit of negatives through so neurons don't "die"
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;activation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;relu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sigmoid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tanh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tanh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                       &lt;span class="c1"&gt;# "leaky_relu"
&lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Input → output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;activation([-2,-1,0,1,2], "relu")     -&amp;gt; [0.0, 0.0, 0.0, 1.0, 2.0]
activation([-1,0,1], "sigmoid")       -&amp;gt; [0.269, 0.5, 0.731]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Gotcha:&lt;/strong&gt; in &lt;code&gt;1 / (1 + torch.exp(-t))&lt;/code&gt;, the parentheses matter. Without them, Python computes &lt;code&gt;(1/1) + exp(-t)&lt;/code&gt; because division runs before addition. When a whole expression is the denominator, wrap it in brackets.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The big picture
&lt;/h2&gt;

&lt;p&gt;Put it together and you have the entire core loop of deep learning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;numbers → make a guess → measure the error → compute the slopes → adjust → repeat&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it. Tensors hold the numbers. Matrix multiply and activations make the guess. Autograd computes the slopes. Everything else — CNNs, transformers, LLMs — is a remix of these same five ideas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coming in Part 2:&lt;/strong&gt; we take these pieces and assemble them into a real, working neural network from scratch.&lt;/p&gt;

&lt;p&gt;If this was useful, follow along — I'm building the whole thing in public, one part at a time.&lt;/p&gt;

&lt;p&gt;🔗 I post the short version of each part on X: &lt;a href="https://x.com/meclinafrancis" rel="noopener noreferrer"&gt;@Meclin_A_Francis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pytorch</category>
      <category>python</category>
      <category>deeplearning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What are vectors?</title>
      <dc:creator>Meclin A Francis</dc:creator>
      <pubDate>Sat, 22 Mar 2025 09:08:06 +0000</pubDate>
      <link>https://dev.to/meclin/1-what-are-vectors-1k9o</link>
      <guid>https://dev.to/meclin/1-what-are-vectors-1k9o</guid>
      <description>&lt;h2&gt;
  
  
  Let's start with the basics
&lt;/h2&gt;

&lt;p&gt;Vectors are mathematical tools for describing things that have both size and direction.&lt;/p&gt;

&lt;p&gt;Imagine you're describing how to get somewhere. You wouldn't just say "go 25 kilometers," you'd also say which way to go, right?&lt;/p&gt;

&lt;p&gt;That's what vectors do! They're mathematical objects that capture both direction and magnitude. So, if a bike travels 25km west from point A to point B, we can neatly represent that information as a vector.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykwqwx6f6bl49fnlhwe6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykwqwx6f6bl49fnlhwe6.png" alt="example of a vector" width="306" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The vector captures the bike's displacement. Its magnitude reveals the distance traveled (15km), and its direction specifies the direction (west).&lt;/p&gt;

&lt;p&gt;The vector starts at point B (the tail) and ends at point A (the head). We can represent this vector using its endpoints, writing it as&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0p7jotpjsayuuruxoq6n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0p7jotpjsayuuruxoq6n.png" alt="reference to north direction" width="62" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's say we need to illustrate the displacement vector of a bike that travels 15km on a bearing of 60 degrees. What would that diagram look like?&lt;/p&gt;

&lt;p&gt;Let's pick a starting point for our vector anywhere on the plane. We'll use a vertical line to show which way is north.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8lr90on6y3jbl3n5pta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8lr90on6y3jbl3n5pta.png" alt="gereg" width="140" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we go 60 degree clockwise from the north&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3uv1gc8q1b8kf13di4lw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3uv1gc8q1b8kf13di4lw.png" alt="result" width="248" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;equal vectors !&lt;/p&gt;

&lt;p&gt;For vectors to be considered equal, they must have the same length and point in the same direction. The example vectors in the image illustrate this concept.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3c667kkmcqhji9h8ymxq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3c667kkmcqhji9h8ymxq.png" alt="equal" width="289" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the picture above, we can say &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2tlqy4y7qfwhaxw6jdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2tlqy4y7qfwhaxw6jdn.png" alt="ev" width="262" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding how to add vectors using the triangle law.
&lt;/h2&gt;

&lt;p&gt;To add two vectors together, a visual method is to connect them head-to-tail. to be more descriptive "The sum of two vectors can be found graphically by positioning the starting point (tail) of one vector at the ending point (head) of the other."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cp0ekidnsaylh8mkl5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cp0ekidnsaylh8mkl5g.png" alt="graph example" width="376" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding 'a' and 'b' involves a simple geometric construction. First, place the tail of vector 'b' at the head of vector 'a'. Then, the vector 'a+b' is the one that connects the tail of 'a' to the head of 'b'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yh24zfcyqqxdyxl2drv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yh24zfcyqqxdyxl2drv.png" alt="resultant" width="376" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This method of adding vectors head-to-tail is known as the triangle law, and the resulting vector from this addition is often called the "resultant" vector.&lt;/p&gt;

&lt;p&gt;opposite and the zero vector&lt;/p&gt;

&lt;p&gt;Imagine a vector going from point A to point B (AB). The opposite vector (BA) travels the same distance but goes from point B back to point A.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufced7ucs3pf405mkcr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufced7ucs3pf405mkcr3.png" alt="Zero vector" width="351" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we write &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf6qrmcocgk1g37gwke0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf6qrmcocgk1g37gwke0.png" alt="summation" width="164" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To compute the sum of two opposite vectors,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzo5g5zdqu5u4qw18dk65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzo5g5zdqu5u4qw18dk65.png" alt="oppositev" width="164" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we can use the triangle law of addition.&lt;/p&gt;

&lt;p&gt;The triangle law of addition tells us that when adding vectors, the result ("resultant") is a vector drawn from the starting point of the first vector to the ending point of the last. If we end up back where we started (the tail and head meet), &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmhk0bv2coea5fxrc3oe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmhk0bv2coea5fxrc3oe.png" alt="zero" width="270" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we get a special vector called the zero vector, denoted as 0. It has no direction and zero length, meaning its head and tail are at the same location.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding how to subtract vectors using the triangle law.
&lt;/h2&gt;

&lt;p&gt;We've learned how the triangle law helps us add vectors. But did you know we can also use it for subtraction? &lt;/p&gt;

&lt;p&gt;The secret is to realize that subtracting a vector is the same as adding its inverse. So, the operation &lt;strong&gt;a&lt;/strong&gt; - &lt;strong&gt;b&lt;/strong&gt; is identical to &lt;strong&gt;a&lt;/strong&gt; &lt;strong&gt;+&lt;/strong&gt; &lt;strong&gt;(-b)&lt;/strong&gt;. Remember, &lt;strong&gt;-b&lt;/strong&gt; is simply &lt;strong&gt;b&lt;/strong&gt; pointing the other way, with the same length. Let's clarify this with an example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs72ye6ncld391g3n82xi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs72ye6ncld391g3n82xi.png" alt="subraction" width="382" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Subtracting vector &lt;strong&gt;b&lt;/strong&gt; from vector &lt;strong&gt;a&lt;/strong&gt; (written as &lt;strong&gt;a - b&lt;/strong&gt;) can be thought of as adding &lt;strong&gt;a&lt;/strong&gt; to the &lt;em&gt;opposite&lt;/em&gt; of &lt;strong&gt;b&lt;/strong&gt; (written as &lt;strong&gt;a + (-b)&lt;/strong&gt;). The vector &lt;strong&gt;-b&lt;/strong&gt; has the same length as &lt;strong&gt;b&lt;/strong&gt; but points in the exact opposite direction.&lt;/p&gt;

&lt;p&gt;To visualize this, imagine drawing vector &lt;strong&gt;a&lt;/strong&gt; anywhere on a plane. Then, starting from the tip (head) of vector &lt;strong&gt;a&lt;/strong&gt;, draw vector &lt;strong&gt;-b&lt;/strong&gt;. Now, the resulting vector (&lt;strong&gt;a - b&lt;/strong&gt;) is the one that connects the starting point (tail) of &lt;strong&gt;a&lt;/strong&gt; to the ending point (head) of &lt;strong&gt;-b&lt;/strong&gt;. This follows the triangle law of addition, but with &lt;strong&gt;-b&lt;/strong&gt; instead of &lt;strong&gt;b&lt;/strong&gt;."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs57qt5t4eo7w71gm8s39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs57qt5t4eo7w71gm8s39.png" alt="subtract law of triangle" width="382" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Figuring out the length or size of a vector.
&lt;/h2&gt;

&lt;p&gt;Let's say we have a vector that goes from point A to point B, and we call it "a". The size or length of this vector – also known as its magnitude or modulus – is written as |AB| or |a|.&lt;/p&gt;

&lt;p&gt;For instance, if a vector (let's call it AB) has a length of 8, we'd write that as |AB| = 8.&lt;/p&gt;

&lt;p&gt;Now, imagine this: vector "a" points straight up and has a length of 5 (|a|=5). Vector "b" points directly to the right and has a length of 8 (|b|=8). How would we find the length of the vector we get when we add "a" and "b" together (i.e., what is |a+b|)?&lt;/p&gt;

&lt;p&gt;The first step is to use the triangle law of vector addition to figure out what the resulting vector (a+b) looks like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fat1rng8xdwbqijgsxthl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fat1rng8xdwbqijgsxthl.png" alt="magnitude addition" width="456" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking at the diagram, we can see a right triangle is formed. This allows us to use the Pythagorean theorem to find relationships between the sides.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59siso4pm7oz4a3th6v2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59siso4pm7oz4a3th6v2.png" alt="pythagorean" width="244" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;= 25 + 64&lt;br&gt;
= 89&lt;/p&gt;

&lt;p&gt;therefore, |a+b|= √ 89 = 9.43&lt;/p&gt;

&lt;p&gt;Important: We just used the Pythagorean theorem, but be careful! This only holds true when the vectors 'a' and 'b' are perpendicular (at right angles). This isn't always the case! Next, we'll tackle how to work with vectors that are not at right angles.&lt;/p&gt;

&lt;p&gt;Calculating the magnitude of a vector using the law of cosines&lt;/p&gt;

&lt;p&gt;if adding vectors using the triangle law doesn't result in a right triangle, we can't rely on the Pythagorean theorem to easily calculate the magnitude of the resulting vector. &lt;/p&gt;

&lt;p&gt;For instance, when we add vectors 'a' and 'b' and the resulting triangle isn't a right triangle (instead, it has an angle greater than 90 degrees, called an obtuse angle, theta), the Pythagorean theorem won't work directly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pn51ri6tr0pypuvb490.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pn51ri6tr0pypuvb490.png" alt="cosine law" width="455" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;how ever we can use the law of cosines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy73noyaqmbd8jia04aov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy73noyaqmbd8jia04aov.png" alt="cosine law2" width="455" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have two vectors and you visualize their sum as forming a triangle, you can always calculate the length of the sum vector using the law of cosines.&lt;/p&gt;

</description>
      <category>mathematics</category>
      <category>beginners</category>
      <category>ai</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
