तंत्रिका नेटवर्क अपने स्वयं के प्रशिक्षण डेटा पर गलत भविष्यवाणी क्यों करता है?


13

मैंने डेटा स्टॉक पूर्वानुमान के लिए पर्यवेक्षित शिक्षण के साथ एक LSTM (RNN) तंत्रिका नेटवर्क बनाया। समस्या यह है कि यह अपने प्रशिक्षण डेटा पर गलत भविष्यवाणी क्यों करता है? (नोट: नीचे दिए गए प्रतिलिपि योग्य उदाहरण )

मैंने अगले 5 दिनों के स्टॉक मूल्य की भविष्यवाणी करने के लिए सरल मॉडल बनाया:

model = Sequential()
model.add(LSTM(32, activation='sigmoid', input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(Dense(y_train.shape[1]))
model.compile(optimizer='adam', loss='mse')

es = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)
model.fit(x_train, y_train, batch_size=64, epochs=25, validation_data=(x_test, y_test), callbacks=[es])

सही परिणाम y_test(5 मान) हैं, इसलिए मॉडल ट्रेनें, पिछले 90 दिनों की ओर देख रही हैं और फिर सबसे अच्छे ( val_loss=0.0030) परिणाम से वजन बहाल करती हैं patience=3:

Train on 396 samples, validate on 1 samples
Epoch 1/25
396/396 [==============================] - 1s 2ms/step - loss: 0.1322 - val_loss: 0.0299
Epoch 2/25
396/396 [==============================] - 0s 402us/step - loss: 0.0478 - val_loss: 0.0129
Epoch 3/25
396/396 [==============================] - 0s 397us/step - loss: 0.0385 - val_loss: 0.0178
Epoch 4/25
396/396 [==============================] - 0s 399us/step - loss: 0.0398 - val_loss: 0.0078
Epoch 5/25
396/396 [==============================] - 0s 391us/step - loss: 0.0343 - val_loss: 0.0030
Epoch 6/25
396/396 [==============================] - 0s 391us/step - loss: 0.0318 - val_loss: 0.0047
Epoch 7/25
396/396 [==============================] - 0s 389us/step - loss: 0.0308 - val_loss: 0.0043
Epoch 8/25
396/396 [==============================] - 0s 393us/step - loss: 0.0292 - val_loss: 0.0056

भविष्यवाणी परिणाम बहुत बढ़िया है, है ना?

यहाँ छवि विवरण दर्ज करें

ऐसा इसलिए है क्योंकि एल्गोरिथ्म ने # 5 युग से सर्वश्रेष्ठ वजन बहाल किया। ओके, अब इस मॉडल को .h5फाइल करने, बैक -10 दिनों को स्थानांतरित करने और पिछले 5 दिनों की भविष्यवाणी करने के लिए सहेजें (पहले उदाहरण में हमने मॉडल बनाया और 17-23 अप्रैल को सप्ताहांत के दिन सहित, अब 2-8 अप्रैल को परीक्षण करते हैं)। परिणाम:

यहाँ छवि विवरण दर्ज करें

यह बिल्कुल गलत दिशा दिखाता है। जैसा कि हम देखते हैं कि मॉडल को प्रशिक्षित किया गया था और 17-23 अप्रैल को सत्यापन के लिए # 5 युग सर्वश्रेष्ठ लिया गया था, लेकिन 2-8 पर नहीं। अगर मैं और अधिक ट्रेन करने की कोशिश करता हूं, तो मैं जो भी चुनूं, उसके साथ खेलता हूं, जो कुछ भी करता हूं, उसमें हमेशा बहुत समय अंतराल होता है, जिसमें गलत भविष्यवाणी होती है।

मॉडल अपने स्वयं के प्रशिक्षित डेटा पर गलत परिणाम क्यों दिखाता है? मैंने डेटा को प्रशिक्षित किया, यह याद रखना चाहिए कि सेट के इस टुकड़े पर डेटा की भविष्यवाणी कैसे करें, लेकिन गलत भविष्यवाणी करता है। मैंने भी क्या प्रयास किया:

  • अधिक या कम सुविधाओं को जोड़ते हुए, 50k + पंक्तियों, 20 साल के स्टॉक की कीमतों के साथ बड़े डेटा सेट का उपयोग करें
  • विभिन्न प्रकार के मॉडल बनाएं, जैसे अधिक छिपी हुई परतें जोड़ना, अलग बैच_साइज, विभिन्न परतों की सक्रियता, ड्रॉपआउट, बल्लेबाजी
  • कस्टम अर्लीस्टॉपिंग कॉलबैक बनाएं, कई वैलिडेशन डेटा सेट से औसत वेल_लॉस प्राप्त करें और सर्वश्रेष्ठ चुनें

शायद मुझे कुछ याद है? मैं क्या सुधार कर सकता हूं?

यहाँ बहुत ही सरल और प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है। yfinanceडाउनलोड एस एंड पी 500 स्टॉक डेटा।

"""python 3.7.7
tensorflow 2.1.0
keras 2.3.1"""


import numpy as np
import pandas as pd
from keras.callbacks import EarlyStopping, Callback
from keras.models import Model, Sequential, load_model
from keras.layers import Dense, Dropout, LSTM, BatchNormalization
from sklearn.preprocessing import MinMaxScaler
import plotly.graph_objects as go
import yfinance as yf
np.random.seed(4)


num_prediction = 5
look_back = 90
new_s_h5 = True # change it to False when you created model and want test on other past dates


df = yf.download(tickers="^GSPC", start='2018-05-06', end='2020-04-24', interval="1d")
data = df.filter(['Close', 'High', 'Low', 'Volume'])

# drop last N days to validate saved model on past
df.drop(df.tail(0).index, inplace=True)
print(df)


class EarlyStoppingCust(Callback):
    def __init__(self, patience=0, verbose=0, validation_sets=None, restore_best_weights=False):
        super(EarlyStoppingCust, self).__init__()
        self.patience = patience
        self.verbose = verbose
        self.wait = 0
        self.stopped_epoch = 0
        self.restore_best_weights = restore_best_weights
        self.best_weights = None
        self.validation_sets = validation_sets

    def on_train_begin(self, logs=None):
        self.wait = 0
        self.stopped_epoch = 0
        self.best_avg_loss = (np.Inf, 0)

    def on_epoch_end(self, epoch, logs=None):
        loss_ = 0
        for i, validation_set in enumerate(self.validation_sets):
            predicted = self.model.predict(validation_set[0])
            loss = self.model.evaluate(validation_set[0], validation_set[1], verbose = 0)
            loss_ += loss
            if self.verbose > 0:
                print('val' + str(i + 1) + '_loss: %.5f' % loss)

        avg_loss = loss_ / len(self.validation_sets)
        print('avg_loss: %.5f' % avg_loss)

        if self.best_avg_loss[0] > avg_loss:
            self.best_avg_loss = (avg_loss, epoch + 1)
            self.wait = 0
            if self.restore_best_weights:
                print('new best epoch = %d' % (epoch + 1))
                self.best_weights = self.model.get_weights()
        else:
            self.wait += 1
            if self.wait >= self.patience or self.params['epochs'] == epoch + 1:
                self.stopped_epoch = epoch
                self.model.stop_training = True
                if self.restore_best_weights:
                    if self.verbose > 0:
                        print('Restoring model weights from the end of the best epoch')
                    self.model.set_weights(self.best_weights)

    def on_train_end(self, logs=None):
        print('best_avg_loss: %.5f (#%d)' % (self.best_avg_loss[0], self.best_avg_loss[1]))


def multivariate_data(dataset, target, start_index, end_index, history_size, target_size, step, single_step=False):
    data = []
    labels = []
    start_index = start_index + history_size
    if end_index is None:
        end_index = len(dataset) - target_size
    for i in range(start_index, end_index):
        indices = range(i-history_size, i, step)
        data.append(dataset[indices])
        if single_step:
            labels.append(target[i+target_size])
        else:
            labels.append(target[i:i+target_size])
    return np.array(data), np.array(labels)


def transform_predicted(pr):
    pr = pr.reshape(pr.shape[1], -1)
    z = np.zeros((pr.shape[0], x_train.shape[2] - 1), dtype=pr.dtype)
    pr = np.append(pr, z, axis=1)
    pr = scaler.inverse_transform(pr)
    pr = pr[:, 0]
    return pr


step = 1

# creating datasets with look back
scaler = MinMaxScaler()
df_normalized = scaler.fit_transform(df.values)
dataset = df_normalized[:-num_prediction]
x_train, y_train = multivariate_data(dataset, dataset[:, 0], 0,len(dataset) - num_prediction + 1, look_back, num_prediction, step)
indices = range(len(dataset)-look_back, len(dataset), step)
x_test = np.array(dataset[indices])
x_test = np.expand_dims(x_test, axis=0)
y_test = np.expand_dims(df_normalized[-num_prediction:, 0], axis=0)

# creating past datasets to validate with EarlyStoppingCust
number_validates = 50
step_past = 5
validation_sets = [(x_test, y_test)]
for i in range(1, number_validates * step_past + 1, step_past):
    indices = range(len(dataset)-look_back-i, len(dataset)-i, step)
    x_t = np.array(dataset[indices])
    x_t = np.expand_dims(x_t, axis=0)
    y_t = np.expand_dims(df_normalized[-num_prediction-i:len(df_normalized)-i, 0], axis=0)
    validation_sets.append((x_t, y_t))


if new_s_h5:
    model = Sequential()
    model.add(LSTM(32, return_sequences=False, activation = 'sigmoid', input_shape=(x_train.shape[1], x_train.shape[2])))
    # model.add(Dropout(0.2))
    # model.add(BatchNormalization())
    # model.add(LSTM(units = 16))
    model.add(Dense(y_train.shape[1]))
    model.compile(optimizer = 'adam', loss = 'mse')

    # EarlyStoppingCust is custom callback to validate each validation_sets and get average
    # it takes epoch with best "best_avg" value
    # es = EarlyStoppingCust(patience = 3, restore_best_weights = True, validation_sets = validation_sets, verbose = 1)

    # or there is keras extension with built-in EarlyStopping, but it validates only 1 set that you pass through fit()
    es = EarlyStopping(monitor = 'val_loss', patience = 3, restore_best_weights = True)

    model.fit(x_train, y_train, batch_size = 64, epochs = 25, shuffle = True, validation_data = (x_test, y_test), callbacks = [es])
    model.save('s.h5')
else:
    model = load_model('s.h5')



predicted = model.predict(x_test)
predicted = transform_predicted(predicted)
print('predicted', predicted)
print('real', df.iloc[-num_prediction:, 0].values)
print('val_loss: %.5f' % (model.evaluate(x_test, y_test, verbose=0)))


fig = go.Figure()
fig.add_trace(go.Scatter(
    x = df.index[-60:],
    y = df.iloc[-60:,0],
    mode='lines+markers',
    name='real',
    line=dict(color='#ff9800', width=1)
))
fig.add_trace(go.Scatter(
    x = df.index[-num_prediction:],
    y = predicted,
    mode='lines+markers',
    name='predict',
    line=dict(color='#2196f3', width=1)
))
fig.update_layout(template='plotly_dark', hovermode='x', spikedistance=-1, hoverlabel=dict(font_size=16))
fig.update_xaxes(showspikes=True)
fig.update_yaxes(showspikes=True)
fig.show()

3
आजकल के प्रतिक्रमण के उदाहरण बहुत कम मिलते हैं (समान प्रश्नों के बिना चकाचौंध के विपरीत) जो आपके पोस्ट की शुरुआत में अपने अस्तित्व का विज्ञापन करने के लिए यकीनन एक अच्छा विचार है (जोड़ा गया;)
डेजर्टनॉट

7
समस्या सिर्फ यह हो सकती है कि आप शेयर बाजार से बहुत अधिक पूर्वानुमान की उम्मीद कर रहे हैं। यदि आपने 1 मिलियन सिक्के के फ़्लिप के अनुक्रम में किसी मॉडल को प्रशिक्षित किया है और फिर सिक्का फ़्लिप की भविष्यवाणी करने के लिए इसे प्राप्त करने का प्रयास किया है, तो मॉडल को गलत होने पर आश्चर्य नहीं होगा, भले ही फ़्लिप प्रशिक्षण डेटा से आया हो - मॉडल इसके प्रशिक्षण डेटा को याद रखने और इसे फिर से संगठित करने की उम्मीद नहीं है।
user2357112

2
@ User2357112supportsMonica ने जो कहा, उसके अलावा, आपके मॉडल का मतलब सही है, जो वास्तव में सभी है, मैं वास्तव में प्राप्त करने के लिए इस तरह के मॉडल की उम्मीद करूंगा (कम से कम किसी भी निरंतरता के साथ), और आप 5 दिनों से बहुत अधिक की उम्मीद कर रहे हैं डेटा। आपको वास्तव में बहुत अधिक डेटा की आवश्यकता है जो किसी भी महत्व के साथ कहने में सक्षम हो कि आपके मॉडल में क्या त्रुटि है।
एरॉन

मॉडल को ट्यून करने के लिए बहुत अधिक पैरामीटर हैं। मैंने उनमें से कुछ को रोकने की कोशिश की जैसे कि शुरुआती रोक (धैर्य = 20), युगों की संख्या में वृद्धि, 32 से 64 तक lstm इकाइयों में वृद्धि आदि परिणाम बहुत बेहतर थे। यहाँ की जाँच github.com/jvishnuvardhan/Stackoverflow_Questions/blob/master/... । जैसा कि @sirjay द्वारा और अधिक फीचर्स (वर्तमान में केवल 4) जोड़कर, अधिक लेयर (lstm, batchnorm, dropout, etc) जोड़कर हाइपर पैरामीटर ऑप्टिमाइज़ेशन चलाने का उल्लेख किया गया है, जिसके परिणामस्वरूप बेहतर प्रदर्शन होगा।
विष्णुवर्धन जनपति

@VishnuvardhanJanapati जाँच के लिए धन्यवाद। मैंने आपका कोड, सहेजा गया मॉडल संकलित किया, फिर सेट किया df.drop(df.tail(10).index, inplace=True), उसने वही खराब परिणाम दिखाया जैसा कि मेरे पास था।
सिरजय २

जवाबों:


3

मॉडल अपने स्वयं के प्रशिक्षित डेटा पर गलत परिणाम क्यों दिखाता है? मैंने डेटा को प्रशिक्षित किया, यह याद रखना चाहिए कि सेट के इस टुकड़े पर डेटा की भविष्यवाणी कैसे करें, लेकिन गलत भविष्यवाणी करता है।

आप चाहते हैं कि मॉडल याद रखने के बजाय इनपुट और आउटपुट के बीच संबंध सीखे। यदि कोई मॉडल प्रत्येक इनपुट के लिए सही आउटपुट को याद करता है, तो हम कह सकते हैं कि यह प्रशिक्षण डेटा को पूरा करने में सक्षम है। अक्सर आप डेटा के एक छोटे सबसेट का उपयोग करके मॉडल को ओवरफिट करने के लिए मजबूर कर सकते हैं, इसलिए यदि वह व्यवहार जिसे आप देखना चाहते हैं तो आप यह कोशिश कर सकते हैं।


1

मूल रूप से यदि आप प्रशिक्षण डेटा के लिए बेहतर परिणाम प्राप्त करना चाहते हैं, तो आपके प्रशिक्षण की सटीकता यथासंभव अधिक होनी चाहिए। आपको अपने पास मौजूद डेटा के संबंध में बेहतर मॉडल का उपयोग करना चाहिए। मूल रूप से आपको यह देखना चाहिए कि परीक्षण सटीकता की परवाह किए बिना इस उद्देश्य के लिए आपका प्रशिक्षण सटीकता है या नहीं। इसे ओवरफिटिंग भी कहा जाता है जो परीक्षण डेटा के बजाय प्रशिक्षण डेटा में बेहतर सटीकता देता है।

इस परिदृश्य के लिए शुरुआती रोक प्रभावित हो सकती है जहां प्रशिक्षण सटीकता के बजाय सर्वोत्तम परीक्षण / सत्यापन सटीकता ली जाती है।


1

संक्षिप्त उत्तर:

सेट:

batch_size = 1
epochs = 200
shuffle = False

अंतर्ज्ञान: आप प्रशिक्षण डेटा में उच्च सटीकता की प्राथमिकता का वर्णन कर रहे हैं। यह ओवरफिटिंग का वर्णन कर रहा है। ऐसा करने के लिए, बैच आकार को 1 पर सेट करें, युगों को उच्च, और फेरबदल करना।


1

ओपी एक दिलचस्प खोज को बताता है। मुझे मूल प्रश्न को इस प्रकार सरल बनाना चाहिए।

यदि मॉडल को किसी विशेष समय श्रृंखला पर प्रशिक्षित किया जाता है, तो मॉडल पिछली बार की श्रृंखला के डेटा को फिर से क्यों नहीं बना सकता है, जो पहले से ही प्रशिक्षित था?

खैर, जवाब प्रशिक्षण प्रगति में ही अंतर्निहित है। चूंकि EarlyStoppingओवरफिटिंग से बचने के लिए यहां उपयोग किया जाता है, इसलिए सबसे अच्छा मॉडल बचा लिया जाता है epoch=5, जहां val_loss=0.0030ओपी द्वारा उल्लेख किया गया है। इस समय, प्रशिक्षण नुकसान के बराबर है 0.0343, अर्थात, प्रशिक्षण का आरएमएसई है 0.185। चूंकि डेटासेट का उपयोग किया जाता है MinMaxScalar, इसलिए हमें यह समझने के लिए RMSE के स्केलिंग को पूर्ववत करने की आवश्यकता है कि क्या हो रहा है।

समय अनुक्रम के न्यूनतम और अधिकतम मान पाए जाते हैं 2290और 3380। इसलिए, 0.185प्रशिक्षण के आरएमएसई के रूप में होने का मतलब है कि, प्रशिक्षण सेट के लिए भी, अनुमानित मूल्य जमीनी सच्चाई मूल्यों से लगभग भिन्न हो सकते हैं 0.185*(3380-2290), जो कि ~200औसत रूप से इकाइयाँ हैं।

यह बताता है कि पिछले समय के कदम पर प्रशिक्षण डेटा की भविष्यवाणी करते समय एक बड़ा अंतर क्यों है।

मुझे प्रशिक्षण डेटा का पूरी तरह से अनुकरण करने के लिए क्या करना चाहिए?

मैंने यह सवाल खुद से पूछा। इसका सरल उत्तर यह है कि प्रशिक्षण की हानि को करीब 0लाएं, जो मॉडल से अधिक है।

कुछ प्रशिक्षण के बाद, मैंने महसूस किया कि केवल 1 एलएसटीएम परत वाली एक मॉडल जिसमें 32कोशिकाएं होती हैं, वह जटिल नहीं होती है ताकि प्रशिक्षण डेटा का पुनर्निर्माण किया जा सके। इसलिए, मैंने निम्न के रूप में एक और LSTM परत जोड़ी है।

model = Sequential()
    model.add(LSTM(32, return_sequences=True, activation = 'sigmoid', input_shape=(x_train.shape[1], x_train.shape[2])))
    # model.add(Dropout(0.2))
    # model.add(BatchNormalization())
    model.add(LSTM(units = 64, return_sequences=False,))
    model.add(Dense(y_train.shape[1]))
    model.compile(optimizer = 'adam', loss = 'mse')

और मॉडल 1000को विचार किए बिना युगों के लिए प्रशिक्षित किया जाता है EarlyStopping

model.fit(x_train, y_train, batch_size = 64, epochs = 1000, shuffle = True, validation_data = (x_test, y_test))

1000वें युग के अंत में हमारे पास एक प्रशिक्षण हानि है, 0.00047जो आपके मामले में प्रशिक्षण हानि से बहुत कम है। इसलिए हम मॉडल को प्रशिक्षण डेटा को बेहतर ढंग से फिर से संगठित करने की उम्मीद करेंगे। निम्नलिखित 2-8 के लिए भविष्यवाणी की साजिश है।

भविष्यवाणी

एक अंतिम नोट:

किसी विशेष डेटाबेस पर प्रशिक्षण का मतलब यह नहीं है कि मॉडल को प्रशिक्षण डेटा को पूरी तरह से फिर से संगठित करने में सक्षम होना चाहिए। खासतौर पर, जब ओवरफिटिंग से बचने के लिए शुरुआती ठहराव, नियमितीकरण और ड्रॉपआउट जैसे तरीकों को पेश किया जाता है, तो मॉडल प्रशिक्षण डेटा को याद रखने के बजाय अधिक सामान्य हो जाता है।


0

मॉडल अपने स्वयं के प्रशिक्षित डेटा पर गलत परिणाम क्यों दिखाता है? मैंने डेटा को प्रशिक्षित किया, यह याद रखना चाहिए कि सेट के इस टुकड़े पर डेटा की भविष्यवाणी कैसे करें, लेकिन गलत भविष्यवाणी करता है।

देखो तुम क्या कर रहे हो:

  1. कुछ परतों के साथ एक मॉडल का निर्माण
  2. प्रशिक्षण मॉडल के साथ प्रशिक्षण_डाटा
  3. जब आप मॉडल को प्रशिक्षित करते हैं, तो सभी ट्रेन योग्य पैरामीटर प्रशिक्षित हो जाते हैं (यानी, मॉडल का वजन बच गया)
  4. ये वेट अब इनपुट और आउटपुट के बीच संबंध का प्रतिनिधित्व करते हैं।
  5. जब आप फिर से उसी प्रशिक्षण_दत्ता की भविष्यवाणी करते हैं, तो इस बार प्रशिक्षित मॉडल आउटपुट प्राप्त करने के लिए वज़न का उपयोग करता है।
  6. आपके मॉडल की गुणवत्ता अब भविष्यवाणियां तय करती है और इसलिए वे मूल परिणामों से भिन्न होते हैं, भले ही डेटा समान हो।

0

यह अंडर-फिटिंग है और यह सुधारने के लिए कि मुझे आपकी छिपी हुई परतों में न्यूरॉन्स जोड़ने की आवश्यकता है। " एक अन्य बिंदु सक्रियण फ़ंक्शन 'रिले' है। सिग्मॉइड अच्छे परिणाम नहीं देता है। इसके अलावा, आपको अपनी उत्पादन परत में 'सॉफ्टमैक्स' को परिभाषित करने की आवश्यकता है।


लगता है जैसे आप बाजार की भविष्यवाणी करने के लिए रहस्यों को पकड़ते हैं। उसे और क्या करना चाहिए?
डैनियल स्कॉट

0

मॉडल आर्किटेक्चर और एडाप्ट्रडर के ऑप्टिमाइज़र को बदलने के बाद, मैं परिणामों को कुछ हद तक सुधारने में सक्षम था।

यहाँ Adagrad अनुकूलक का उपयोग करने का कारण है:

यह मापदंडों के लिए सीखने की दर को बढ़ाता है, अक्सर होने वाली सुविधाओं से जुड़े मापदंडों के लिए छोटे अपडेट (यानी कम सीखने की दर), और असीम सुविधाओं से जुड़े मापदंडों के लिए बड़े अपडेट (यानी उच्च सीखने की दर) करता है। इस कारण से, यह विरल डेटा से निपटने के लिए अच्छी तरह से अनुकूल है।

कृपया नीचे दिए गए कोड को देखें:

model = Sequential()
model.add(LSTM(units=100,return_sequences=True, kernel_initializer='random_uniform', input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=100,return_sequences=True, kernel_initializer='random_uniform'))
model.add(LSTM(units=100,return_sequences=True, kernel_initializer='random_uniform'))
model.add(Dropout(0.20))
model.add(Dense(units=25, activation='relu'))
model.add(Dense(y_train.shape[1]))

# compile model
model.compile(loss="mse", optimizer='adagrad', metrics=['accuracy'])
model.summary()

स्टॉक भविष्यवाणी एक बहुत ही चुनौतीपूर्ण कार्य है इसलिए किसी एकल मॉडल की भविष्यवाणी से चिपके रहने के बजाय, हम एक भविष्यवाणी करने के लिए कई मॉडल एक साथ काम कर सकते हैं और फिर अधिकतम वोट किए गए परिणाम के आधार पर कॉल, एक पहनावा सीखने के दृष्टिकोण के समान होता है। इसके अलावा, हम कुछ मॉडलों को एक साथ जोड़ सकते हैं जैसे:

  1. डीप फीड-फॉरवर्ड ऑटो-एनकोडर न्यूरल नेटवर्क आयाम को कम करने के लिए + डीप रिक्वायरल न्यूरल नेटवर्क + एआरआईएमए + एक्सट्रीम बूस्टिंग ग्रैडिएंट रिग्रेसर

  2. Adaboost + बैगिंग + अतिरिक्त पेड़ + ढाल बूस्टिंग + यादृच्छिक वन + XGB

सुदृढीकरण सीखने वाले एजेंट स्टॉक की भविष्यवाणी में बहुत अच्छा कर रहे हैं जैसे:

  1. कछुआ-व्यापारिक एजेंट
  2. मूविंग-एवरेज एजेंट
  3. सिग्नल रोलिंग एजेंट
  4. पॉलिसी-ग्रेडिएंट एजेंट
  5. क्यू-लर्निंग एजेंट
  6. विकास-रणनीति एजेंट

कृपया यहां एक बहुत ही संसाधनपूर्ण लिंक खोजें ।


0

संशय # 1 - नियमितीकरण

तंत्रिका नेटवर्क प्रशिक्षण डेटा को ओवरफिट करने में महान हैं, वास्तव में प्रशिक्षण डेटासेट पर यादृच्छिक लेबल द्वारा CIFAR10 (छवि वर्गीकरण कार्य) लेबल (y मान) की जगह एक प्रयोग होता है और नेटवर्क लगभग शून्य नुकसान के परिणामस्वरूप यादृच्छिक लेबल फिट बैठता है।

यहाँ छवि विवरण दर्ज करें

बाईं ओर हम देख सकते हैं कि दिए गए पर्याप्त युगों के यादृच्छिक लेबलों को लगभग 0 का नुकसान होता है - सही स्कोर ( गहरी सीखने को समझने के लिए 2016 के zhang et al द्वारा पुन: सामान्यीकरण की आवश्यकता होती है )

तो हर समय ऐसा क्यों नहीं हो रहा है? नियमितीकरण

नियमितीकरण (लगभग) अनुकूलन समस्या (नुकसान) की तुलना में कठिन समस्या को हल करने की कोशिश कर रहा है जिसे हमने मॉडल के लिए परिभाषित किया है।

तंत्रिका नेटवर्क में कुछ सामान्य नियमितीकरण विधियाँ:

  • जल्दी रुकना
  • ड्रॉप आउट
  • बैच का सामान्यीकरण
  • वजन में गिरावट (जैसे l1 l2 मानदंड)
  • डेटा वृद्धि
  • यादृच्छिक / गाऊसी शोर जोड़ना

इन विधियों से ओवरफिटिंग को कम करने में मदद मिलती है और आमतौर पर बेहतर सत्यापन और परीक्षण प्रदर्शन होता है, लेकिन कम ट्रेन प्रदर्शन (जो वास्तव में अंतिम पैराग्राफ पर समझाया गया है) के परिणामस्वरूप नहीं होता है।

ट्रेन डेटा प्रदर्शन आमतौर पर इतना महत्वपूर्ण नहीं होता है और इसके लिए हम सत्यापन सेट का उपयोग करते हैं।

संदिग्ध # 2 - मॉडल का आकार

आप 32 इकाइयों के साथ सिंगल LSTM लेयर का उपयोग कर रहे हैं। बहुत छोटा है। आकार बढ़ाने की कोशिश करें और यहां तक ​​कि दो एलएसटीएम परतें (या द्विदिश एक) डालें और मुझे यकीन है कि मॉडल और अनुकूलक आपके डेटा को तब तक छोड़ देगा जब तक आप उन्हें जाने नहीं देते हैं - यानी शुरुआती रोक, पुनर्स्थापना_ब्लास्ट_वीट्स और ऊपर निर्दिष्ट किसी भी नियमितीकरण को हटा दें।

ओवरफिटिंग पर ध्यान दें:

किसी को प्रशिक्षण डेटा को ओवरफिट करने के लिए उच्च बेकार प्रशिक्षण के प्रदर्शन का पीछा नहीं करना चाहिए , क्योंकि हम आमतौर पर ट्रेन डेटा के समान गुणों के साथ नए अनदेखी डेटा पर एक मॉडल के साथ अच्छा प्रदर्शन करने की कोशिश करते हैं। सभी विचारों को लक्ष्य के साथ डेटा और सहसंबंध के गुणों को सामान्य बनाने और सीखने की कोशिश करना है, अर्थात जो सीखना है वह है :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.