本文主題是:使用Mql4應用神經網路的教學文章。文中將分析神經網路的基礎概念,瞭解Kohonen神經網路,並在MT4上實作交易優化方法(隨附範例檔)。
構建Kohone神經網路,需要的材料:
1) 任意貨幣對的 10,000 個歷史k棒;
2) 5 grams的移動平均線(或任何其他指標 – 可自行選擇);
3) 2到3層的逆向分佈(inverse distribution)數據資料;
4) 最佳化的優化方法;
5) 正成長的帳戶淨值,與一定量對市場走向的正確預測。
建構Kohonen層的做法
這一節探討各種Kohonen層實務上的做法,以取自基礎版本且經典的參考內容的,搭配明性圖進行講解。我們將討論以下問題:
- Kohonen 權向量的調整方式;
- 輸入向量的前期準備工作;
- 選擇 Kohonen 神經元的初始權值。
Kohonen 神經網路是一類神經網路,其主要元素為Kohonen層。Kohonen層包含自我調整線性加法器(“線性形式神經元”)。通常,Kohonen層的輸出信號的處理依據是“贏家通吃”規則,即:競爭學習(competitive learning)策略:最大的信號變為 1,其他信號統統變為 0。
舉例來討論:如何對對任意的輸入向量,計算輸出值。如圖 1 ,輸入向量以黃色表示。在Kohonen層的各個神經元(K1, K2)則是計算將輸入內容乘以其權值的總和。實際上,Kohonen層的所有權值都是此神經元的向量座標,如W11, W12, W21, W22。
各個 Kohonen 神經元的輸出是兩個向量的點積。當向量間的角度越趨於 0(角度余弦趨於 1),點積將達到最大值。因此,Kohonen層神經元的最大值將會是最接近輸入向量的的那個神經元。根據“贏家通吃”規則,接著便找出所有神經元中的最大輸出值,給定其輸出賦值為 1,而將其他所有神經元則賦值為 0。
圖 1 贏家是向量最接近輸入信號的神經元。
Kohonen 權向量的調整
如上所述,層訓練的目的是對輸入向量進行精確的空間分類(The purpose of layer training is the precise space classification of input vectors. )。獲勝神經元與輸入神經元之間的誤差必須小於(勝過)其他的神經元。因此,獲勝神經元會在輸入向量的一側“拐回來”,才能得到較小的誤差。如圖 2 顯示兩個神經元(黑色神經元)針對兩個輸入向量(彩色的向量)的區分(division)。Fig 2 shows the division of two neurons (black neurons) for two input vectors (colored ones).
每次反覆運算時,獲勝神經元都會靠近“其自己的”輸入向量。它的新座標根據以下公式計算得出:
其中,A(t) 是訓練速度參數,取決於時間 t。這是一個非增(nonincreasing)函數,每次反覆運算時都會從 1 降至 0。如果初始值為 A=1,則將在某個階段執行權值校正。當每個輸入向量都有一個 Kohonen 神經元時(例如,Kohonen層中有 10 個輸入向量和 10 個神經元),就有可能出現這種情況。
【進一步了解 SOM)】(按我)
自組織特徵映射(self-organizing feature maps, SOM)網路是基於「競爭式學習」的一種網路,輸出層的類神經元們彼此競爭,爭取被活化的機會。這種競爭靠輸出層類神經元間的「側向聯結」來實現,側向聯結以一種貌似「墨西哥帽」的函數為學習方式,讓不只獲勝神經元得到學習演化,它鄰近的神經元也能夠學習。因此,自我組織特徵映射在競爭之外,也有「有福同享」的合作機制。
但實際上,這種情況幾乎不可能出現,因為我們通常需要把大量輸入資料劃分為多個包含類似資料的組,從而減少了輸入資料的多樣性。這就是值 A=1 不可取的原因。實踐表明,最佳初始值應小於 0.3。
此外,A 與輸入向量的數量成反比。即,如果 A 較大,最好進行小規模校正,使獲勝神經元不會“穿過”其整個校正空間。作為 A 的功能,通常會選擇任意單調遞減函數。例如,雙曲線下降或線性下降,或 Gaussian 函數。
圖 3 顯示速度 A=0.5 時的神經元權值修正步驟。神經元越靠近輸入向量,誤差越小。
圖 3. 神經元權值校正受輸入信號的影響。
寬樣本時的少量神經元(Small Number of Neurons at a Wide Sample)
圖 4. 兩個輸入向量之間的神經元波動。
圖 4(左)中有兩個輸入向量(以彩色顯示)和僅僅一個 Kohonen 神經元。在校正期間,神經元將從一個向量轉至另一個向量(點線)。當 A 值減小至 0 時,它在兩者之間穩定下來。神經元座標隨時間的變動可以鋸齒形波浪線表示(圖 4 右)。
圖 5 分類類型對神經元數量的依賴關係。
圖 5 中顯示了另一種情況。在第一種情況中,四個神經元把樣本充分地劃分為四個超球體區域。在第二種情況中,神經元數量不足,導致誤差增大且樣本重新分類。因此,我們可以得出以下結論:Kohonen層必須包含足夠數量的可用神經元,這取決於已分類樣本的數量。
輸入向量情況下的預先準備
Philip D. Wasserman 在他的書中寫道,在將輸入向量放到網上之前,最好(雖然不是必須的)將它們「標準化」。方法是將輸入向量的各個分量除以向量長度。此長度是通過從向量分量平方和中提取平方根得出的。以下是代數標記法:
這可將輸入向量轉換為同一方向的單位向量,即 n 維空間中單位長度的向量。此操作的含義很明顯 - 投射超球體表面上的所有輸入向量,從而簡化搜索Kohonen層的任務。換句話說,為了搜索輸入向量與向量-Kohonen 神經元之間的角度,我們應該消除向量長度等因素,使所有神經元的幾率等同。
樣本向量的元素通常是非負值(例如,移動平均線的值、價格)。它們都集中於正象限空間。此類“正”樣本標準化的結果是,大量向量累積在僅僅一個正區域內,這種情況對於獲取資格來說並不有利。所以我們才能在標準化之前執行樣本平滑處理。如果樣本相當大,我們可以假設向量基本上聚集於一個區域,沒有遠離主樣本的“outsiders”。因此,可將樣本相對於其“極值”座標居中放置。
圖 6 輸入向量的標準化。
如上所述,向量標準化是有必要的。它能夠簡化Kohonen層的校正工作。但是,我們應該明確給出一個樣本,並確定是否將其映射到球體上。
表 1. 將輸入向量的範圍縮小至 [-1, 1]
for (N=0; N<nNeuron[0]; N++) // for all neurons of the input layer
{
min=in[N][0]; // finding minimum in the whole sample
for (pat=0; pat<nPattern; pat++) if (in[N][pat]<min) min=in[N][pat];
for (pat=0; pat<nPattern; pat++) in[N][pat]-=min; // shift by the value of the minimal value
max=in[N][0]; // finding maximum in the whole sample
for (pat=0; pat<nPattern; pat++) if (in[N][pat]>max) max=in[N][pat];
for (pat=0; pat<nPattern; pat++) in[N][pat]=2*(in[N][pat]/max)-1; // narrowing till [-1,1]
}
如果我們要標準化輸入向量,我們應該相應地將所有神經元權值都標準化。
選擇初始神經元權值
這有無數的可能。
1) 像平常對神經元所做的那樣(隨機化),將隨機值分配給權值;
2) 按示例初始化,將從訓練樣本中隨機選擇的示例的值指派為初始值;
3) 線性初始化。在這種情況下,權值是由沿整個線性空間線性排序,並介於初始資料集中的兩個向量之間的向量值發出的;
4) 所有權值具有相同的值 - 凸組合方法。
讓我們分析第一種和最後一種情況。
1) 將隨機值分配給權值
隨機化期間,所有向量神經元都分佈在超球體的表面上。而輸入向量有分組的趨勢。在這種情況下,有些權向量可能與輸入向量相距太遠,它們絕無可能提供較好的關聯,因此它們無法學習 - 圖 7(右)中的“灰色”數字。此外,剩餘的神經元將不足以最大程度減小誤差並劃分類似的類 -“紅色”類包括在“綠色”神經元中。
圖 7 隨機化神經元的訓練結果。
如果一個區域內聚集了大量神經元,多個神經元可以進入一個類的區域,並將其劃分為多個子類 - 圖 7 中的橙色區域。這並不重要,因為之後對層信號的進一步處理可以修復此問題,但這需要佔用訓練時間。
解決這些問題的方法之一是在初始階段,對一個獲勝神經元的向量進行校正,同時也對最接近此神經元的向量組進行校正。然後組的數量逐漸減小,最終僅校正一個神經元。可從已排序的神經元輸出陣列中選擇一個組。將矯正前 K 個最大輸出中的神經元。
另一個 權向量的組調整方法是以下方法。
a) 為各個神經元定義校正向量的長度:
b) 距離最短的神經元成為獲勝者 - Wn. 之後,如果找到一組神經元,其關聯限制在距離 Wn 的 C*Ln 處。
c) 根據一個簡單的規則
來校正這些神經元的權值。這樣就完成了整個樣本的校正。
C 參數在訓練過程中從某個數位(通常是 1)更改為 0。
第三個 有趣的方法表明每個神經元在一次完整的樣本流程中僅可校正 N/k 次。這裡,N 是樣本的大小,k 是神經元數量。即,如果任意神經元成為獲勝者的次數比其他神經元多,它會“退出遊戲”直至完成樣本流程。這樣,其他神經元也可學習。
2) 凸組合(convex combination)方法
此方法意味著權向量和輸入向量初始時都放置於同一區域內。輸入向量和初始權向量的當前座標的計算公式如下:
其中,n 是輸入向量的維數,a(t) 是時間的非減函數,各個反覆運算將其值從 0 增加到 1,結果,所有輸入向量與權向量一致,最終取代了它們。此外,權向量將“達到”其類。
以上是神經網路中應用的Kohonen層的基礎內容。接著要要寫mql4 script 來採集k棒的資料,並創建一個輸入向量(以 MA 為例)。
創建輸入向量檔
// input parameters
#define NUM_BAR 10000 // number of bars for training (number of training patterns)
#define NUM_MA 5 // number of movings
#define DEPTH_MA 3 // number of values of a moving
// creating a file
hFile = FileOpen(FileName, FILE_WRITE|FILE_CSV);
FileSeek(hFile, 0, SEEK_END);
// Creating an array of inputs
int i, ma, depth;
double MaIn;
for (i=NUM_BAR; i>0; i--) // going through bars and collecting values of MA fan
{
for (depth=0; depth<DEPTH_MA; depth++) //calculating moving values
for (ma=0; ma<NUM_MA; ma++)
{
MaIn=iMA(NULL, 0, 2+MathSqrt(ma*ma*ma)*3, 0, 1, 4,
i+depth*depth)- ((High[i+depth*depth] + Low[i+depth*depth])/2);
FileWriteDouble(hFile, MaIn);
}
}
創建的資料檔案用作應用程式之間的資訊傳遞手段。如果你正在熟悉訓練演算法,強烈建議查看其操作的中期結果和一些變數的值,並在必要時更改訓練條件。
因此我們推薦你使用高級程式設計語言(VB、VC++ 等),而 MQL4 的當前調試手段尚有不足(我希望這種情況在 MQL5 中能夠有所改善)。之後,當你瞭解你的演算法和函數的所有誤區後,你可以開始使用 MQL4。此外,你必須在 MQL4 中編寫最終目標(指標或 Expert Advisor)。
廣義的類結構
表 3. 神經網路的Classes
class CNeuroNet : public CObject
{
public:
int nCycle; // number of learning cycles until stop
int nPattern; // number of training patterns
int nLayer; // number of training layers
double Delta; // required minimal output error
int nNeuron[iMaxLayer]; // number of neurons in a layer (by layers)
int LayerType[iMaxLayer]; // types of layers (by layers)
double W[iMaxLayer][iMaxNeuron][iMaxNeuron];// weights by layers
double dW[iMaxLayer][iMaxNeuron][iMaxNeuron];// correction of weight
double Thresh[iMaxLayer][iMaxNeuron]; // threshold
double dThresh[iMaxLayer][iMaxNeuron]; // correction of threshold
double Out[iMaxLayer][iMaxNeuron]; // output value
double OutArr[iMaxNeuron]; // sorted output values of Kohonen layer
int IndexWin[iMaxNeuron]; // sorted neuron indexes of Kohonen layer
double Err[iMaxLayer][iMaxNeuron][iMaxNeuron];// error
double Speed; // Speed of training
double Impuls; // Impulse of training
double in[100][iMaxPattern]; // Vector of input values
double out[10][iMaxPattern]; // vector of output values
double pout[10]; // previous vector of output values
double bar[4][iMaxPattern]; // bars, on which we learn
int TradePos; // order direction
double ProfitPos; // obtained profit/loss of an order
public:
CNeuroNet();
virtual ~CNeuroNet();
// functions
void Init(int aPattern=1, int aLayer=1, int aCycle=10000, double aDelta=0.01, double aSpeed=0.1,
double aImpuls=0.1);
// learning functions
void CalculateLayer(); // Calculation of layer output
void CalculateError(); // Error calculation /for Target array/
void ChangeWeight(); // Correction of weights
bool TrainNetwork(); // Network training
void CalculateLayer(int L); // Output calculation of Kohonen layer
void CalculateError(int L); // Error calculation of Kohonen layer
void ChangeWeight(int L); // Correction of weights for layer indication
bool TrainNetwork(int L); // Training of Kohonen layer
bool TrainMPS(); // Network training for getting the best profit
// variables for internal interchange
bool bInProc; // flag for entering the TrainNetwork function
bool bStop; // flag for the forced termination of the TrainNetwork function
int loop; // number of the current iteration
int pat; // number of the current processed pattern
int iMaxErr; // pattern with the maximal error
double dMaxErr; // maximal error
double sErr; // square of pattern error
int iNeuron; // maximal number of neurons in Kohonen layer correction
int iWinNeuron; // number of winner neurons in Kohonen layer
int WinNeuron[iMaxNeuron]; // array of active neurons (ordered)
int NeuroPat[iMaxPattern][iMaxNeuron]; // array of active neurons
void LinearCovariation(); // normalization of the sample
void SaveW(); // Analysis of neuron activity
};
這個 class 並不複雜。它包含必要的主要設置和服務變數。主要項目分析如下:
根據使用者的命令,介面類別創建一個工作執行緒並初始化一個計時器,用於定期讀出網路值。它還接收用於從神經網路參數中讀取資訊的索引。工作執行緒先從初步製備的檔中讀取輸入/輸出向量的陣列,並設置層的參數(層的類型以及各個層中的神經元數量)。之後,我們調用函數 CNeuroNet::Init,並在其中初始化權值,標準化樣本,並設置訓練參數(速度、脈衝、必要誤差和訓練迴圈次數)。等上述工作完成後,才調用“主力軍(workhorse)”- CNeuroNet::TrainNetwork 函數(或 TrainMPS或 TrainNetwork(int L),這取決於我們想要獲得什麼。並在完成訓練後,將權值存到檔案,以便在在指標 indicator 或 Expert Advisor 中應用最後所得到的權值。
III. 神經網路的調校
接著轉到訓練的問題。訓練主要是對各個輸入pattern及其對應的特定結果,基於輸入與目標值之間的差異,執行權值校正。例如,想要讓網路基於前十個傳到網路上的k棒價格來預測下一個k棒的價格。在這種情況下,在放置了 10 個值作為輸入之後,我們需要比較所輸出的結果與教學值(真實質)的差距,然後根據它們之間的差異校正權值。
圖 8 已訓練神經網路的方案。
已在樣本上預先訓練過的Kohonen層將其向量進一步轉發給網路。輸出網路的最後一層時,我們將獲得值 OUT,其意義如下。如果 OUT>0.5,執行買入交易;如果 OUT<0.5,執行賣出交易(sigmoid 值的變化範圍為 [0, 1])。
假設網路以輸出 OUT1 >0.5 來回復某個輸入向量 OUT1。這意味著我們在此模式所屬的k棒上建了一個買入倉位。之後,在輸入向量在某個 Xk 上的時間表示形式上,符號 OUTk 轉變為“反方向”。結果,我們關閉了買入倉位並打開了賣出倉位。
就在此時,我們需要查看已結訂單的結果。如果我們獲利,我們可以強化這一提示。或者我們可以認為沒有誤差並將無需進行任何校正。如果我們虧損,我們將校正層的權值,以使 X1 向量的提示的輸入顯示 OUT1<0.5。.
現在讓我們計算教學(目標)輸出的值。同樣地,讓我們將發生的損失(以點數計算)中的 sigmoid 乘以交易方向信號得到一個值。結果,虧損越大,對網路的懲罰越嚴厲,對其權值的校正值就越大。例如,如果我買入倉位有 =50 個虧損點,則將按以下方式計算對輸出層的校正:
我們可以界定引入交易分析流程參數 TakeProfit (TP) 和 StopLoss (SL)(以點數計算)的交易規則。所以我們需要跟蹤 3 個事件: 1) 更改 OUT OUT 信號,2) 價格從建倉價格改變了 TP 的值,3) 價格從建倉價格改變了值 -SL。
出現以下事件之一時,將以類似方式修正權值。如果我們獲利,權值可保持不變或進行校正(更強信號)。如果我們虧損,則校正權值以使 X1 向量的提示的輸入顯示 向量的提示的輸入顯示 OUT1 和“期望”信號。
此限制唯一的缺陷是我們使用絕對 TP 和 SL 值,固定的值在當下條件下很難對對很長期間的市場,達成網路的優化。且經驗上看來,TP 和 SL 的值不會相差太大。這表示系統必須對稱( symmetrical ),以避免在更全域的買入或賣出訓練期間發生趨勢的方向上的偏離。此外,也有另一觀點認為,TP 應比 SL 大 2 到 4 倍。 這樣我們就人為地增大了獲利交易與虧損交易的比率。但這種情況的風險是訓練的網路有轉向趨勢。這兩種做法都是可行的,但必須先進行研究。
表 4. 網路權值設置的一個反覆運算
int TradePos;
int pat=0; // open an order for the first pattern
for(i=0;i<nNeuron[0];i++) Out[0][i]=in[i][pat]; // take the training pattern
CalculateLayer(); // calculate the network output
TradePos=TradeDir(Out[nLayer-1][0]); // if exit is larger than 0.5, then buy. Otherwise - sell
ipat=pat; // remember the pattern
for(pat=1;pat<nPattern;pat++) // go through the pattern and train the network
{
for(i=0;i<nNeuron[0];i++) Out[0][i]=in[i][pat]; // take the training pattern
CalculateLayer(); // calculate the network output
ProfitPos=1e4*TradePos*(bar[3][pat]-bar[3][ipat]); // calculate profit/loss at close prices [3]
// if trade direction has changed or stop order has triggered
if (TradeDir(Out[nLayer-1][0])!=TradePos || ProfitPos>=TP || ProfitPos<=-SL)
{
// correcting weights
Out[nLayer][0]=Sigmoid(0.1*TradePos*ProfitPos); // set the desired output of the network
for(i=0;i<nNeuron[0];i++) Out[0][i]=in[i][ipat];// take the pattern by which
// CalculateLayer() were opened;
// calculate the network output
CalculateError(); // calculate the error
ChangeWeight(); // correct weights
for(i=0;i<nNeuron[0];i++) Out[0][i]=in[i][pat]; // go to the new order CalculateLayer();
// calculate the new output of the network
TradePos=TradeDir(Out[nLayer-1][0]); // if output is > 0.5, then buy
//otherwise sell ipat=pat;
// remember the pattern
}
}
通過這些過程,網路最終將分配從Kohonen層中獲取的類,使入市提示中的最大獲利交易數對應於各個類。從統計學的角度來看:各個輸入模式經由連結節點,發揮團隊運作的綜效來調整權重值。而同一個輸入向量在權值調整過程中可以在不同方向上提供提示,逐漸獲得最大真實預測數,這種方法可稱為動態方法。
以下是網路權值調整的結果。
圖中的每個點都是一次訓練週期內所獲利潤的值(以點數計算)。此系統始終存在於市場上,TakeProfit = StopLoss = 50 個點,僅由止損訂單來進行固定,並在獲利和虧損情況下校正權值。
請看,在開局不利的情況下,層的權值被調整,使利潤在大約第 100 個反覆運算上變為正值。一個有趣的事實是,系統某種程度上減慢了速度。這與訓練速度的參數相關。
如列表 2 中所示,利潤 ProfitPos 是按滿足某一條件(止損訂單或提示更改)的入市k棒的收盤價來計算的。當然,這是一個比較粗糙的方法,尤其是在使用止損訂單的情況下。我們可以通過分析k棒的最高價和最低價(對應於 bar[1][ipat] 和 bar[2][ipat])來添加較複雜的方法。你可以試著自己做做看。
尋求或尋找入市?
我們研究動態訓練方法,即讓網路自己從失敗中吸取教訓。你肯定已經注意到,根據此演算法,我們始終在市場中,固定利潤/損失,然後再做進一步的打算。所以,我們需要限制我們的入市,並試著僅在使用“有利”的輸入向量時才入市。這意味著我們需要定義入市網路提示級別與獲利/虧損交易數的依賴關係。
這個任務相當簡單。讓我們引入變數 0<M<0.5,它將是所需入市的標準。如果 Out>0.5+M,則買入,如果 Out<0.5-M,則賣出。我們根據 0.5-M<Out<0.5+M 之間的向量來篩選入市和退市。
另一個篩選不必要向量的方法是從網路的某些輸出項的值中收集有關訂單盈利能力的統計資訊。讓我們稱其為視覺化分析。在此之前,我們應定義平倉方法 - 觸及止損訂單,網路輸出信號更改。然後讓我們創建一個表格 Out | ProfitPos。Out 和 ProfitPos 的值是針對各個輸入向量(即針對各個k棒)而計算的。
然後讓我們製作 ProfitPos 欄位的匯總表。結果,我們將看到 Out 值與所獲利潤的依賴關係。選擇範圍 Out=[MLo, MHi],在此範圍內,我們會得到最高利潤,並在交易中使用其值。
回到 MQL4來做
開始進行 VC++ 開發後,為了方便起見, 我們並未試著減少 MQL4 的使用。當然,你可以用不同的語言來完成同樣的任務,但最好還是選一個對於特定任務來說具有最佳的功能性/難度比的語言。因此,在網路訓練之後,我們應該將其所有參數保存到一個檔中,然後傳輸至 MQL4。
- 輸入向量的大小
- 輸出向量的大小
- 層數
- 神經元數量(按層) - 從輸入到輸出
- 神經元權值(按層)
此指標將僅使用類庫 CNeuroNet 中的一個函數 - CalculateLayer。讓我們為各個k棒構建一個輸入向量,計算網路輸出的值並構建指標 [6]。
如果我們已確定輸入價位,我們可以為所得曲線的各個部分塗上不同的顏色。本文隨附了代碼 !NeuroInd.mq4 的範例。
IV. 警告和建議
- 網路自我調整性。神經網路是一個逼近器(approximator)。神經網路在獲得節點時會恢復曲線。如果點數太多,未來的結構不會有好結果。應從訓練中移除舊曆史資料,然後添加新資料。這就是逼近新多項式的方法。
- 訓練過度。這種情況出現在執行“理想”調整時(或對網路進行輸入值雜訊方面的訓練時)。結果,當某個測試值被提供給網路時,它將顯示錯誤的結果(圖 9)。
圖 9 網路“訓練過度”的結果 - 預測錯誤。
- 訓練樣本的複雜性、可重複性、不一致性。在文章 [8, 9] 中,作者分析了枚舉參數之間的依賴關係。如果不同的教學向量(或是更糟糕的對立的教學向量)對應於同一個學習向量,則網路將永遠無法學會正確將它們分類,我想這一點是顯而易見的。為此,我們應創建大輸入向量,使它們包含允許在類空間中界定它們的資料。圖 10 顯示了這種依賴關係。向量的複雜性越高,模式的可重複性和不一致性越低。
圖 10 輸入向量的特性的依賴關係。
- 用 Boltzmann方法執行的網路訓練。
此方法類似於嘗試使用各種可能的權數值型別。Expert Advisor ArtificialIntelligence 在其學習過程中也遵循類似的原理。在訓練一個網路時,它遍歷所有類型的權值,並選擇最佳組合。
對電腦來說,這是個勞力密集型的任務,所以一個網路的所有權值數限制為 10 個。例如,如果權值以 0.01 的步長從 0 更改為 1,我們需要 100 步。如果有 5 個權值,那就有 5100 種組合。這是個很大的數字,這個任務超出了電腦的能力範圍。用此法構建網路的唯一途徑是使用大量電腦,每台電腦處理一個部分。這個任務可以用 10 台電腦來執行。每台處理 510 個組合,那麼在使用更大的權值數、層數和步驟數之後,網路會變得愈加複雜。
與這種“蠻力破解”法不同的是,Boltzmann方法更柔和也更快捷。每次反覆運算時,都將針對權值設置一個隨機移動。如果使用新權值時,系統的輸入特性得以改善,則將接受此權值並進行新的反覆運算。
如果權值增大了輸出誤差,則其被接受的可能性由 Boltzmann 分配公式進行計算。因此,開始時網路輸出可以有完全不同的值,然後逐漸“冷卻”,縮減至必要的全域最小值 [10, 11]。
當然,這並不是全部的後續學習清單,其他還有 遺傳演算法、提高收斂性法、帶記憶體的網路、徑向網路、關聯機器等。
結論
神經網路並非能夠解決交易中所有問題的靈丹妙藥。
市場是一種智慧,金融投資組合是一個神經網路。
本文譯自 MetaQuotes Software Corp. 原文地址: https://www.mql5.com/en/articles/1562
【附註】
SOM介紹
Pioneered in 1982 by Finnish professor and researcher Dr. Teuvo Kohonen(點我), a self-organising map is an unsupervised learning model, intended for applications in which maintaining a topology between input and output spaces is of importance. The notable characteristic of this algorithm is that the input vectors that are close — similar — in high dimensional space are also mapped to nearby nodes in the 2D space. It is in essence a method for dimensionality reduction, as it maps high-dimension inputs to a low (typically two) dimensional discretised representation and conserves the underlying structure of its input space.
自組織特徵映射網,簡稱SOM網,又稱Kohonen網。Kohonen認為:一個神經網路接受外界輸入模式時,將會分為不同的對應區域,各區域對輸入模式具有不同的回應特徵,而且這個過程是自動完成的。自組織特徵映射正是根據這一看法提出來的,其特點與人腦的自組織特性相類似。
自組織映射(Self-organizing map, SOM)通過學習輸入空間中的資料,生成一個低維、離散的映射(Map),從某種程度上也可看成一種降維演算法。
SOM是一種無監督的人工神經網路。不同於一般神經網路基於損失函數的反向傳遞來訓練,它運用競爭學習(competitive learning)策略,依靠神經元之間互相競爭逐步優化網路。且使用近鄰關係函數(neighborhood function)來維持輸入空間的拓撲結構。
維持輸入空間的拓撲結構:意味著 二維映射包含了資料點之間的相對距離。輸入空間中相鄰的樣本會被映射到相鄰的輸出神經元。
由於基於無監督學習,這意味著訓練階段不需要人工介入(即不需要樣本標籤),我們可以在不知道類別的情況下,對資料進行聚類;可以識別針對某問題具有內在關聯的特徵。
特點歸納:
- 神經網路,競爭學習策略
- 無監督學習,不需要額外標籤
- 非常適合高維資料的視覺化,能夠維持輸入空間的拓撲結構
- 具有很高的泛化能力,它甚至能識別之前從沒遇過的輸入樣本























