呂宜澤
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # 報告架構 1. 簡介(能力) 4. 數據 - longer detailed captions - Re-captioning - Native aspect ratios 6. 模型訓練 - 訓練流程 - Diffusion訓練原理 8. 結構 - ViT - DiT(Diffusion model + Transformer) - VAE - DALL-E 3, CLIP # Sora ## 技術簡介 - 主體為text-to-video模型 - 使用 Transformer 架構做為 Diffusion Model 的核心網路,讓核心網路以 tokens 為處理目標 ## 能力 ### 1. 以文字生成影片 以下影片由這段文字產生:A stylish woman walks down a Tokyo street filled with warm glowing neon and animated city signage. She wears a black leather jacket, a long red dress, and black boots, and carries a black purse. She wears sunglasses and red lipstick. She walks confidently and casually. The street is damp and reflective, creating a mirror effect of the colorful lights. Many pedestrians walk about ### 2. 以圖片生成影片 ### 3. 以影片生成影片(向前後延伸) ### 4. 影片風格轉換/轉場 ## 結構的基礎 ### Latent Diffusion Model 指先將圖片透過某種壓縮還原技術,將輸入壓縮為 latent features,通過 diffusion model 運作後,再還原為原本解析度。 - 優點: - 減少數據處理量而提升效率 - 生成時能保持細節的一致性 ### ViT:Vision Transformer - 將標準的Transformer應用於圖像 - 將圖像切分為多個patch後,將二維patch排列為一維向量作為Transformer的輸入 ![IMG_0934](https://hackmd.io/_uploads/B1lK2bXe0.jpg) 將圖片視為 a sequence of patches 使其可以進行大範圍而且以像素為單位的運算,還有一個優點是它的scalability,可以用很大的資料去訓練 ## 主要結構 **SORA = VAE encoder + DiT(Diffusion Transformer) + VAE decoder + CLIP** ![IMG_0932](https://hackmd.io/_uploads/SJEI5ZmlA.jpg) ### Spacetime latent patches - **"Given a compressed input video, we extract a sequence of spacetime patches which act as transformer tokens."**(from technical report) - 即圖片版的tokens,包含時間的4D立體元素,使DiT能對其針對畫面與時間的連續性計算。 - ![螢幕擷取畫面 2024-04-10 030058](https://hackmd.io/_uploads/BkOilfmx0.png) ### Latent Space Representation ![0_kHJ_LsPi-jz_CreZ](https://hackmd.io/_uploads/ByXaTmug0.png) - Latent Space 是一種用來表示壓縮數據的空間,用以簡化數據而保留最重要的特徵 - 因為在latent space中,相似樣本間的特徵差別被當作多餘訊息簡化了,所以將數據映射至latent space後,相似樣本點間的距離更近 - 例:將三維數據映射至二維latent space ![bAMl5](https://hackmd.io/_uploads/HJLGyNuxA.png) ![L5uRO](https://hackmd.io/_uploads/By6f1V_gA.png) - embedding (嵌入): - 一種將物件(如單詞、句子)轉換成實數向量(一種數學表示) - 將複雜的實體,映射到相對低維的連續向量空間。 1. 將複雜、高維離散的實體,映射到相對低維稠密的連續向量空間。 2. Embedding的目標是表達實體的特徵,包含概念與關係的相似與相異,並且能幫助模型訓練。 3. 在產生的Embedding空間中,相似的實體能在空間中接近,相異的會在空間中距離較遠。 ![螢幕擷取畫面 2024-04-13 234705](https://hackmd.io/_uploads/ByVQKX_lC.png) ![pasted image 0 (1)](https://hackmd.io/_uploads/Hy21W4_gR.png) ### VAE(Variational Autoencoder) Spacetime latent patches的編解碼 - Encoder:將圖片資料變成latent representation - Decoder:將latent representation變回圖片資料 ![螢幕擷取畫面 2024-04-14 005347](https://hackmd.io/_uploads/r1yxt4_eC.png) ### DALL-E 3 - Text-to-Images #### CLIP - DALLE 中文本語意與其圖片之關係是由CLIP模型(Contrastive Language-Image Pre-training)學習得到的 - 其接受大量<圖片-文字>對訓練,學習給定文本與圖像間的聯繫 - 預訓練:預訓練模型由兩個編碼器組成,如上圖左半部分,左上紫色是文字編碼器,左下綠色是影像編碼器。收集了大量匹配的圖像和文字對,然後分別走各自的編碼器得到各自的特徵,再計算特徵兩兩之間的cos相似度,讓配對的特徵相似度越近越好,不配對的相似度越遠越好。這樣就可以完成了CLIP的與訓練。 - 影像分類任務:如上圖右半部人,給一堆類別名,把類別名填到「A photo of a {object}.」裡面然後編碼。然後圖像也做編碼,編碼完成後拿圖像特徵跟文字特徵內積,跟哪個特徵距離最近,我們就認為模型把這張圖分到了哪個類別裡 ![image](https://hackmd.io/_uploads/B1O3bxoeR.png) ### DiT:Diffusion Transformer **將Diffusion Model的中心架構換成Transformer** DiT 參考 ViT(Vision Transformer) 把圖像 tokenized 成序列的方法,將壓縮過的 latent features 也轉換為 token ,在 diffusion 的核心部分(U-net)完全改為 Transformer 架構 - DiT能處理額外訊息,如:類別標籤、文本語意 ![螢幕擷取畫面 2024-04-10 014838](https://hackmd.io/_uploads/ryS9JWQlR.png) ![螢幕擷取畫面 2024-04-10 015622](https://hackmd.io/_uploads/BytK-ZQgR.png) - input為 Diffusion model 的標準輸入以及label $y$(表示繪製條件之標籤,如果是文生圖就是文本) - Patchify : 將input的noise進行切割為patches - Layer norm : Normalization - 將輸入向量做標準化後進行平移縮放 - $\beta$, $\gamma$ 是可學習的縮放因子和偏差項 - $\mu$, $\sigma$分別是輸入資料的平均值和標準差 - Transformer Decoder: - DiT用一個簡單的linear層來實現,直接將每個token映射為 $p \times p \times 2C$ 的tensor(張量),再進行reshape來得到和原始輸入空間維度一樣的輸出 - output之noise作為下次的input輸入 - addLN : adaLN的全名是adaptive layer norm。 layer norm是"逐樣本"將平均值變異數替換為可學習參數beta/gamma的方法,而這裡adaptive指得是額外學習一個逐channel的參數alpha #### MLP(Multilayer perceptron) 多層感知機 利用**gradient descent**找最佳參數解,最後帶入MLP內的前向傳遞 (Forward propagation)即可得到最後的預測值。 ![螢幕擷取畫面 2024-04-14 011748](https://hackmd.io/_uploads/H1SLAVulR.png) - 將一組輸入向量映射至另一組輸出向量 - 可以用來擬合複雜函式和分類 ## 數據 ### 文字標註 - 使用**Re-captioning**技術 - Recaptioning: 用以訓練一個模型將過於簡短的敘述句轉為適合生成模型的詳細文本 - OpenAI結合其擁有的Chatgpt與DALL-E技術,能使訓練的輸入影片資料有更好的文字對應 ![螢幕擷取畫面 2024-04-10 031205](https://hackmd.io/_uploads/HkTQ7M7xA.png) - DALL-E 3有兩種標記方式,分別是 SSC (short synthetic captions)與 DSC (descriptive synthetic captions) ### 原始影片訓練 #### 比較:與過去的影片訓練模型 - 以往影片訓練模型:將影片素材都降到相同大小,會影響輸出品質 傳統方法通常會調整影片大小、裁剪或調整影片的長寬比以適應統一的影片和影像 - SORA:無論影片大小與比例均以原始素材輸入,並引入**patch**的概念統一所有素材 - 核心思想即是將所有圖片與影片統一成 sequence of tokens(patches) - 使得其設計可以兼容不同解析度與長度的影片訓練 ![image](https://hackmd.io/_uploads/SJAulG2gC.png) ## 模型訓練 1. Prompt輸入後,以LLM對文本擴充 2. 使用DALL-E 3(CLIP) 將文本與圖像(影片)間的關聯 3. 影片數據切分成patches並通過VAE編碼器壓縮成 latent space representaion 4. Diffusion Transformer 產生文本到圖像映射 5. DiT產生的 latent space representaion 通過VAE Decoder 恢復成影片數據 ### Diffusion 訓練原理 #### Forward Process:Add noise - 將原圖人工加噪 #### Reverse Process:Denoise - 回推原始圖片 #### 擴散模型 Diffusion 演算法 ![螢幕擷取畫面 2024-04-10 010324](https://hackmd.io/_uploads/SkL7HgmlC.png) 1. Training(一步到位) - line 2 $\rightarrow$ sample clean image $x_0$ - line 3 $\rightarrow$ 在 $[1,T]$ 的範圍中 sample 一個整數 $t$ - t代表denoise階段做到第幾步 - line 4 $\rightarrow$ 從 Normal Distribution 中 sample 一個 $\epsilon$ : noise - $\epsilon$ 之大小與 image 相同,但其內部都是雜訊 - normal distribution mean = 0, variance = 1 - line 5 $\rightarrow$ 內部對$x_0, \epsilon$ 做加權和 : 得到一個有雜訊的圖片 - $\overline{a_t}$ 是事先訂好的一組數字,且為遞減(故可以產生越清晰的圖) - $\epsilon_\theta$ : Noise predictor - 其目標(正確答案)為找出當初與圖片混合的noise(即$\epsilon$),input為(加噪後的圖片, t) - 梯度下降法(gradient descent) - 步驟不斷重複至模型收斂 2. Sampling - line 1 : sample 一個全部為雜訊的圖($X_T$) - line 2 : 跑T次迴圈去逆推乾淨的圖片 - line 3 : 再sample一個 noise $z$ - line 4 : 將$x_t$ (上一個iteration產生的圖片)與noise predicter產生的noise相減得到降噪後圖片 - 加noise $z$ ![IMG_1028](https://hackmd.io/_uploads/HJSRmsnx0.png) ### 推導 #### Maximum Likelihood Estimation ![image](https://hackmd.io/_uploads/SkOURg6eR.png) - $argmax()$ 回傳該最大值所對應的輸入值 - 找到一組參數 $\theta$ 使模型產生真實圖形的可能性最大 ![IMG_1010](https://hackmd.io/_uploads/BJa4Qsng0.png) #### Forward process(加noise) $q(x_t|x_{t-1})$ = given $x_{t-1}$ 影像加 noise 後得到 $x_{t}$ 影像 - $\beta_t$ 先訂好的一組數字,會影響noise與影像之佔比 ![IMG_1036 (1)](https://hackmd.io/_uploads/ryUV1hnxC.png) ![IMG_1032 (1) (2)](https://hackmd.io/_uploads/rJZv6i2gA.png) - 多次的加 noise 流程可以用一次代換 - 可以直接從原始影像 $x_0$ 得到任意 $t$ step 有noise的影像 $x_t$ #### Reversed process(denoise) - Diffusion model 中需要最大化的 lower bound - VAE 其實不是直接找到最大化 likelihood 的生成模型參數組合,它實際上最大化的是 likelihood 的 lower bound ![image](https://hackmd.io/_uploads/SJvFW-plC.png) ![image](https://hackmd.io/_uploads/SyfBTNTlC.png) - Minimize KL divergence - 讓兩分布的mean(一個為定值,一個從denoise model出來)越接近越好 ![IMG_1034](https://hackmd.io/_uploads/SyN--3heR.png) - 首項:表達denoise後的影像與原始圖形的接近程度 - $P(X_T)$:從normal distribution sample出的一個雜訊 KL divergence : 視為兩個分布訊息量的差異 - 末項:評估每一步 denoise 的結果和加 noise 前是否接近, - $q(x_{t-1}|x_t,x_0)$代表在已知$x_0$和$x_t$的情況下,要如何denoise得到$x_{t-1}$ - $p_{\theta}(x_{t-1}|x_t)$代表模型學習出來的denoise函數 ![IMG_1015 (1)](https://hackmd.io/_uploads/SyVJ2s2gC.png) ![IMG_1035](https://hackmd.io/_uploads/H1nGZ32gC.png) - Denoise model 做的事:input 一個 $(x_t, t)$,output 的結果要跟$q(x_{t-1}|x_t,x_0)$的mean(一個$x_0,x_t$加權的組合)越接近越好 - 為甚麼不直接取mean(即分布中機率最大者) $\rightarrow$ 增加一些隨機性 #### Gradient Descent - 梯度下降法是一種不斷去更新參數找「解」的方法 - 找loss function極小值 某目標點距離 = (某目標點的Y值 - 函數i對應某目標點X值的輸出值)² $\rightarrow$ loss function ![image](https://hackmd.io/_uploads/H1d7GznlA.png) 猜的部分是想更改的目標,我們就是期望改了它,可以讓損失函數更靠近0,盡可能的損失越少越好。為了能將變數進行替換,我們將猜的部分換成代數,將3替換成w,1替換成b,所以就變成如下 : ![image](https://hackmd.io/_uploads/rk4rzM3xA.png) - Adagrad ![image](https://hackmd.io/_uploads/r1lRmMhgC.png) 在AdaGrad Optimizer 中,η 乘上 1/√(n+ϵ) 再做參數更新,出現了一個n的參數,n為前面所有梯度值的平方和,利用前面學習的梯度值平方和來調整learning rate ,ϵ 為平滑值,加上 ϵ 的原因是為了不讓分母為0,ϵ 一般值為1e-8 - 前期梯度較小的時候,n較小,能夠放大學習率 - 後期梯度較大的時候,n較大,能夠約束學習率 ### Transformer ![0QSIATv](https://hackmd.io/_uploads/rkg8SZhe0.png) - Softmax:它能將一個含任意實數的K維向量 $z$「壓縮」到另一個K維實向量$\sigma(z)$中,使得每一個元素的範圍都在(0,1)之間並且所有元素的和為1 #### Encoder 1. 首先將輸入的 vector 透過 self-attention 考慮所有的輸入資訊後,輸出一排 vector。 2. 將這一排 vector 丟到 Fully Connected(FC) 的 feed forward network 裡面。 - feedforward:前一個 Layer 的輸出會作為下一個 Layer 的輸入 - 單向傳遞 4. 最後輸出的 vector 就是 block 的輸出。 - residual connection:將輸入的 vector 經過 self-attention 後輸出的結果稱為 a,還要將原本的輸入(b)拉過來與 a 相加得到 a+b 。 - 將 a+b 的結果去做 layer normalization後才得到 FC network 的輸入。 - FC network 也有 residual 的架構,把 FC network 的 input 跟它的 output 加起來得到新的輸出,然後再做一次 layer normalization。這才是 Transformer Encoder 裡面一個 block 真正的輸出。 - positional encoding - positional encoding 使得 Transformer 可以衡量 word 位置相關的資訊,positional encoding 與 word embedding 相加就得到 embedding with position。 - 兩種創建 positional encoding 的方法: - 透過訓練學習 positional encoding 向量 - 使用公式來計算 positional encoding向量 計算 positional encoding 的公式為: ![image](https://hackmd.io/_uploads/S1qApV2xA.png) pos 指的是這個 word 在這個句子中的位置 i指的是 embedding 維度。例如選擇 d_model=512,那麼i就從1數到512 為什麼選擇 sin 和 cos ? positional encoding 的每一個維度都對應著一個正弦曲線,作者假設這樣可以讓模型相對輕鬆地透過對應位置來學習。 #### Decoder - 輸入前一個時間得到的序列,然後同樣進行 Embedding 與 Positional Encoding 後進入進入重複 N 次的 block。 - Masked Multi-Head Attention 多了一個 Masked 的意思就是,模型只會關注他已經產生出來的部分,不會不小心關注未來產生的詞。由於 Decoder 的輸出是一個一個產生的,所以它沒有辦法考慮它未來的輸入。 ## 如何進行影片延長與合成連續影片 - text-to-video : 以透過 LLM/CLIP 生成的文本作為DiT之condition 只要有辦法把任何型態的資料,透過合理的方法 embedding ,都可以作為 diffusion model 的 condition。 因此,把 video 透過 video encoder 抽出來的 embedding 作為 diffusion model 的 condition ,就可能可以訓練影片延長與合成連續影片的功能。 Reference: https://medium.com/ai-blog-tw/video-generation-methods-and-challenges-from-soras-technical-background-a7cd88f28dc7 https://datasciencedojo.com/blog/embeddings-and-llm/ https://tako-analytics.com/2023-09-28-data-science-embedding-and-vector-database-series-1-what-is-embedding/ https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E6%95%B8%E5%AD%B8-%E4%BA%8C-%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95-gradient-descent-406e1fd001f https://zhuanlan.zhihu.com/p/646790176 Self-attention: https://hackmd.io/@abliu/BkXmzDBmr Diffusion Transformer: https://arxiv.org/abs/2212.09748

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully