2018年1月5日 星期五

Deep Learning 筆記


解決問題的方法不外乎三個Step


  1. Model: 把問題Model成一Nerual Network,以窮舉functions(構成一個function set)
    //i.e. 決定天賦
  2. Goodness of function: 決定哪個Function是好的, 哪些是壞的
  3. Pick the best function: Train出最好的Function

--------------------------
Step2中, 評量function好壞的方式有很多, 目地就是希望跟目標越像越好
假設目標是y', 而預測出來的答案是y, 而loss則代表預目標的差距
市面上有很多種評量loss的方式: Mean-Square-Error, Cross-Entropy, classification error

直接講結論:

  1. 分類問題(Training過程): use Cross-Entropy
  2. 回歸問題(Training過程): use MSE
  3. 驗證結果的指標(Training後的驗證): use classification error,  通嘗試validation / testing
    *回歸=regression

下面這篇文章講的淺顯易懂, 說明何時使用哪一種評量作為loss的依據
http://jackon.me/posts/why-use-cross-entropy-error-for-loss-function/


而搜尋出一組function parameter 來最小畫loss的搜尋法, 通常用Gradient Descent
*Pick an initial value for w -- Random, RBM per-train (2006) 但後來證明其實沒有差很多

步驟:

  • 初始畫一組weight, w; 得到一個Loss值, L
  • ∂ L / ∂ w, 負的 表示該方向使Loss變小
  • w' = w - Ƞ * ∂ L / ∂ w
    • Ƞ稱為learning rate: 表示一步要踏多大
於Neural Network更有效率的Gradient Descent演算法: Backpropagation:

--------------------
Use Keras to Build a Network

model = Sequential() //宣告一個model
model.add(Dense(input_dim=28*28,units=500,activation='relu'))
//Dense: full connected, 也可以用convolution
//input_dim: input dimension is 28*28
//units: 500個neural
//activation: 每個nerual的activation function的名字; ex: 'softplus', 'softsign', 'sigmoid', 'tanh', 'hard_sigmoid', 'linear', ...
//用relu的話 => input記得要normalize到0~1;  sigmoid的話就不用
model.add(Dense(units=500,activation='relu'))
model.add(Dense(units=10,activation='softmax'))

最終會定義一個如下圖的network

model.compile(loss='categorical crossentropy', optimizer='adam', metrics=['accurancy']) //configuration
//1) loss: for more loss function, please refer to https://keras.io/losses///2) optimizer: SGD, RMSprop, Adagrad, Adadelta, Adam, Adamax, Nadam
model.fit(x_train, y_train, batch_size=100, epochs=20) //pick the best function
//Both x_train, y_train are numpy array


https://www.tensorflow.org/get_started/mnist/beginners


==========================

CNN 與 RNN

CNN擅長處理image, RNN擅長處理sequence
  • CNN(Covolution Neural Network)
  • RNN(Recurrent Neural Network): 讓Neural Network有記憶


Why CNN for Image
原因是因為Image有以下三種property
  1. A neuron doesn't have to see the whole image to discover the pattern
    (i.e. can connect to small region with less parameter)
    比如影像中通常都只有一小部分是我們需要關注的對象, 用fully connected參數會太多
  2. The same pattern appear in different regions
    用同樣的參數(同一個neuron)就可以判斷不同位置的"鳥嘴", 不用依空間位置而訓練不同的"鳥嘴判斷器"
  3. Sub-sampling the pixels will not change the object
    縮小圖片, 圖片還是不變


Whole CNN

  • (Convolution => Max Pooling) repeat N times => Flattern => Fully Connected Feedforward network
    • Convolution解決前面的property 1, 2
    • Max Pooling解決前面的property 3



  • Convolution: 套filter; 其實就是套Filter下圖中6x6的image, 套3x3的filter, 此filter就是network"需要學"的參數,
    假設已經學出來的話長這樣:
    ..其實就是在做Property2
    數字大者表示原image中與此filter相似.

    畫成Network, 就如同不同neural share同一組weigth(下圖同色)
  • Max Pooling: 切成數個子集合, 然後選最大者, 形成一張更小的image; 其實就是sub-sampling
  • Flattern: 把Max pooling的結果, 拉直成vector, 往下塞給下一階段的Fully connected network


小節:
Deep learning train出來的Network其實很容易被呼嚨
ex: 熊貓塞給network => 辨識出熊貓 => 幫熊貓點一顆痣(加上雜訊) => 就辨識成長臂猿

(上圖用gradient ascend找出最可能讓此Network辨識出是0的圖X0, (1, 2, ..., 8 etc.) )
https://www.youtube.com/watch?v=M2IebCN9Ht4



==========================

 RNN

RNN就是有記憶的network, 通常用來做slot filling
ex: 比如要填 arrive <destination> at <date> ...  輸入 arrive Taipei at Novemeber 2nd 它依序就填入"Taipei"與"11/2"

Network架構如下圖



  • 第一次輸入x1, x2, 經過綠色的neural後, output會在a1 a2中.
  • 當下一次如果又輸入x1, x2, 上次的a1, a2也會加入這一次的運算, 因此同樣x1,x2確會得到不同的output
常見的RNN 通常拿來做語音辨識, 比較常用的叫做: Multiple-Layer LSTM




2016年4月18日 星期一

[C#] 資源釋放的觀念整理 - 筆記


C# 資源釋放的觀念整理 - 筆記
  • 變數分為數值型別參考型別
    • 前者配置於stack, 後者配置於heap
    • 前者當離開變數有效範圍就會直接被釋放
    • 後者僅被視為garbage, 等待GC回收, 不馬上回收視基於調整heap效率所設計的最佳策略
    • 後者發生時: 比如變數assign成NULL、重新指向其他物件、重新初始化
  • 以上資源皆由CLR配置並管理
  • CLR控制的資源稱為manage資源,其他稱unmanage 資源
    • manage資源會自動被GC回收 不須操心
    • unmanage資源必須定義在釋放函式(自行定義如何釋放)
  • 而C#的 Finalize()類似destructor,但是並非明確的在離開有效範圍就被呼叫,而是等待GC呼叫
    • 因此當programmer需要明確定義哪邊要釋放資源時,就會透過設計Dispose()函數來供programmer呼叫
    • 而Dispose發生在: 1. 被programmer明確呼叫的地方    2. Using {...}區塊結束時
      • 而Dispose函數釋放的資源分為兩個部分, 1是manage部分, 2是unmanage的部分
        • Programmer呼叫Dispose()函數視同宣告此變數已無效
        • Programmer呼叫Dispose(): 會呼叫protected型態的Dispose(true)釋放所有資源
        • 倘若是由Finalize()呼叫Dispose,是已離開變數有效範圍的位置,那就只需要回收unmanage資源,因此只需呼叫Dispose(false)的部分
      • 注意,
        倘若Dispose被成功執行了,為了避免稍後Finalize()又再度呼叫一次(註1)Dispose(),Dispose通常還會加上一行 GC.SuppressFinalize(this),告知GC不須在呼叫Dispose()
      • 註1: (http://readily-notes.blogspot.tw/2013/11/gcsuppressfinalize.html)
      • 具有解構子的物件其在被垃圾收集器回收處理時,會先被放入解構佇列之中,再交由另一個專門處理解構動作的執行緒去做解構的動作,當解構的動作完成,該物件又會被放回原來的佇列等待垃圾收集器的回收,因此其性能上的耗費會比沒有解構子的物件還來的多。由於IDisposable在實作上會習慣加入解構子做為保險措施,防止類別的使用者忘記叫用Dispose方法,造成資源的洩漏。故在釋放完資源後,我們應該隨即在後呼叫GC.SuppressFinalize,告知垃圾收集器該物件的解構動作跳過不處理。 
以上是資源釋放的概念,最後附上MSDN的範例code與供我悟懂的原文

// Design pattern for a base class.
public class Base: IDisposable
{
   //Implement IDisposable.
   public void Dispose() 
   {
     Dispose(true);
      GC.SuppressFinalize(this); 
   }

   protected virtual void Dispose(bool disposing) 
   {
      if (disposing) 
      {
         // Free other state (managed objects).
      }
      // Free your own state (unmanaged objects).
      // Set large fields to null.
   }

   // Use C# destructor syntax for finalization code.
   ~Base()
   {
      // Simply call Dispose(false).
      Dispose (false);
   }
}
C# - 資源釋放的觀念整理 < 這篇寫的真的不錯,此筆記由此文整理

2015年11月27日 星期五

[personal note] jshint error

1. 於迴圈中創立function:
https://jslinterrors.com/dont-make-functions-within-a-loop

  • 功能可能work,也可能會不如預期
  • 狀況: 比如迴圈中的function,參考到共用的變數
for (i = 0; i < elems.length; i++) {
elems[i].addEventListener("click", function () {alert(i);});
}
    • 若elems長度為5, 預期click第1個elems會跳出0(i start from 0),然而實際上每個按鈕跳出來都會是5
    • 由於迴圈跑完i會變成5,i這個共用的元件被每個function所參考,所以結果是5
  • Solution: 利用javascript中,function( argument )之argument皆為call by value的特性
    直接把想要的value傳進function,讓每一個function都保存當時的i在自己的argument中




a

2015年5月8日 星期五

[OpenSuSE] YaST2 Control Center is not running as root.\nYou can only see modules that do not require root privileges.

[狀況]
最近Server一直出問題,常常網路服務會斷線

ssh連進去用yast才發現大條了,跳出以下視窗,重開機也無效。

"「YaST2 控制中心」不是以 root 權限執行。\n您只會看到不需要 root 權限的模組。"


一度懷疑難道被駭了XD,

於是打了whoami

我的確是root..

然後上網爬了文爬了這篇,他的問題是記憶體不足,
http://www.linuxintro.org/wiki/YaST2_Control_Center_is_not_running_as_root

於是我也學他跑了
strace -ffs 100 yast 2>file
結果竟無法導出至file


只好用
strace -ffs 100 yast 2>&1|less
導進less來看,太多系統的call我看不懂,於是放棄

繼續GOOGLE到github上有放code
https://github.com/yast/yast-yast2/blob/master/library/desktop/src/clients/menu.rb

def OpenMenu # check if user is root (#246015)
output = Convert.to_map(
SCR.Execute(path(".target.bash_output"), "/usr/bin/id --user")
)
@root = Ops.get_string(output, "stdout", "") == "0\n"
...
# show popup when running as non-root
if !@root
Popup.Notify(
_(
"YaST2 Control Center is not running as root.\nYou can only see modules that do not require root privileges."
)
)
end
nil
end
執行/usr/bin/id --user確認身分是否為ID=0,然後判斷完丟給root變數(True/False)

發現又是個重導(redirection)

想到是否是"導出"的問題,

於是先df看了硬碟使用狀況

尼馬原來是硬碟滿了

把硬碟清出空間以後就沒事了,害我數度以為要重灌了= =

給網路上諸位苦主參考,這個警示訊息真得會嚇死人阿..,以為被駭




----

提供個指令,能查找硬碟內某資料夾最大的幾個檔案
du -sh ./*|sort -rn|head

2014年12月2日 星期二

[openSuSE] Supermicro 重開機後無法進入OS/ Linux halts after reboot/shutdown -r

學校買了一台 Supermicro 6027TR-HTRF 4nodes的server

灌下去才發現灌好openSuSE 12.2以後, 只要重開機(reboots), 下次進OS就會卡在登入畫面


爬文發現不只openSuSE, Ubuntu似乎也有這個問題, 共通點是Supermicro的主機板

估計是bios的問題, 不確定


我的症狀:

當使用下列指令的 或用功能表restart時, 電腦可以關機, 但是重新開機後會停在OS的載入畫面
shutdown -r
reboot


Solution 1: [Success]

URL:
Issue:
reboot does a shutdown instead of rebooting
這比較不像我的症狀,但是真的可行

方法: 停用MEI driver (<-這個driver我不知道幹嘛的, 如果以後真的因為他而碰到其他問題, 我再向您們求助, 暫時沒有發現問題)

1. vim /etc/modprobe.d/blacklist.conf
#不一定叫做blacklist.conf, 像opensuse裡面叫做 50-blacklist.conf, 前面可能有前綴

2. 在檔案結尾加上以下兩行

# Make system reboot
blacklist mei

不過我的電腦重開機時, 跳登入畫面前會進入黑屏, KVM會自動跳到下一台電腦, 這個症狀別台電腦不會, 也許是負作用, 不過暫時沒事..


Solution 2: [Fail]

Issue:
Linux hang/freeze during reboots and restarts
URL:
其實我的症狀比較像這篇寫的

所以我照著去改, 讓grub開機的時候加上參數reboot=xx, 不過沒有用, 如果你的客戶照著這篇網站改過, 卻沒有用, 可以試試看Solution1, 兩種都有可能

欲修改grub開OS餵的參數, 要編輯這個文件 /etc/default/grub, 當中有一條GRUB_CMDLINE_LINUX=""

把它改成
GRUB_CMDLINE_LINUX="reboot=bios"
GRUB_CMDLINE_LINUX="reboot=acpi"

不行的話就照上面URL裡面提到的那10個參數一個一個試

2014年11月24日 星期一

OpenSuSE 12.2 中使用pptpd佈建VPN server,並設置NAT,防火牆設置,log設置

1. 首先 YaST中安裝package pptpd

2.pptpd vpn 相關的設定

vim /etc/pptpd.conf
添加以下設定
(在此我的server有兩張網卡,
本來就有區網 網段為192.168.0.x, 為了避開, 所以改成192.168.16.x,
一般分開兩網段比較方便管理,也有人用10.0.0.x)
# 開啟 debug (會寫到 /var/log/message) 測試完記得關閉
debug
# 連線數
connections 20
ppp /usr/sbin/pppd
option  /etc/ppp/pptpd-options
localip 192.168.16.1
remoteip    192.168.16.201-220
debug 測試的時候可以開(把#號拿掉)
local-ip是你主機的IP, 可故意分在不同網段
connections 可不寫

vim /etc/ppp/options
asyncmap 0
auth
crtscts
lock
hide-password
modem
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
noipx 


vim  /etc/ppp/pptpd-options
name MyVPN

# 與連線加密相關的設定
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
nodefaultroute
lock
nobsdcomp

# 設定要分派的 DNS Server
ms-dns 168.95.1.1
ms-dns 8.8.8.8
# 指定 logfile
logfile /var/log/pptpd.log
# 設定閒置幾秒後自動斷線
idle 7200
最後編輯帳號密碼
vim /etc/ppp/chap-secrets
"username"      MyVPN   "password"    *



開啟 Forward,主要是為了能夠進行 NAT
vim /etc/sysctl.conf
 net.ipv4.ip_forward = 1

service network reload

3.啟動pptpd

最後啟動 pptpd 並且設定 pptpd 開機自動啟用
chkconfig --level 345 pptpd on
service pptpd start

檢查 pptpd是否有 run 起來:
service --status-all | grep pptp

note: 重啟pptpd的方法
service pptpd restart


3. 防火牆設置

opensuse 12.2內建SuSE2firewall ,我不會改iptables..
所以直接對internal的route設通通可以

vim /etc/sysconfig/SuSEfirewall2
記得備份!

裡面加入以下設定
#對internal 開放
FW_ALLOW_CLASS_ROUTING="int"

FW_ROUTE="yes"
FW_MASQUERADE="yes"

FW_DEV_INT="ppp+"
#如果對內本來還有別張網卡, ex eth1
#那就改成 "eth1 ppp+" 以空白隔開
 完成 


Appendix. 其他linux之防火牆設置

一般linux的話, 直接照著網路上常有的nat設定 for vpn即可(port 1723 與 gre協定)

先來做個備份吧

iptables-save > ./iptables_backup
note: 還原的方法
iptables-restore < ./iptables_backup

開始設定iptable
#開啟 forward
echo "1" > /proc/sys/net/ipv4/ip_forward
#pptp
iptables -t nat -A POSTROUTING -s 192.168.16.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -i eth0 -p gre -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
 
Appendix.2 自訂log要記錄的資料
 vim /etc/ppp/ip-down.local
 以下為範例:
 (改完後記得還要chmod 把ip-down.local改成可執行 ex: chmod 777 /etc/ppp/ip-down.local)

#!/bin/bash

BASENAME=${0##*/}
INTERFACE=$1
DEVICE=$2
SPEED=$3
LOCALIP=$4
REMOTEIP=$5
IPPARAM=$6


echo "================================================" >> /var/log/pptpd.log
echo "log of clientIP: $6    username: $PEERNAME" >> /var/log/pptpd.log
echo "------------------------------------------------" >> /var/log/pptpd.log
echo "/etc/ppp/ip-down.local starts.." >> /var/log/pptpd.log
echo "time: `date -d today +%F,%T`" >> /var/log/pptpd.log
echo "interface: $1    device: $2" >> /var/log/pptpd.log
echo "assignIP: $5" >> /var/log/pptpd.log
echo "================================================" >> /var/log/pptpd.log
 
 
非常有幫助的資料:
在 Linux 安裝 VPN Server 教學 (pptpd on CentOS)  
PPTP协议的VPN服务器的搭建,包括pptpd的自动启动...  
 

2014年7月13日 星期日

Parallel HARQ processes 平行的HARQ程序

概念是從這篇介紹UMTS中HARQ程序的文章中看到的
http://letstalkumts.blogspot.tw/2011/10/harq-procedure.html

此篇前面敘述的前提應是UMTS中downlink部分,最後下面分點敘述才提到uplink部分



Automatic Repeat Request(ARQ)
是基本的重傳機制,reciver一旦發現收到的資料有誤,就全部捨棄,然後向sender要求重傳

Hybrid ARQ(HARQ)
則是檢查錯誤後,若有錯 就把資料buffer起來,並向sender要求重傳,然後根據buffer的data與重傳的data合併成無誤的結果 ( channel decoding and error detection)

Parallel HARQ processes
是用來避免重傳對throughput的影響。
當一個HARQ程序正在等待ACK時,第二個HARQ程序就可以趁此機會 在接下來的TTI傳送資料
這些parallel processes就稱為Stop and Wait processes

3GPP中,允許最大8個parallel HARQ processes被config給同一個UE (DL)



原文應在TS 36.213 section 7,其中註名HARQ process的最大數量