Học máy có thể học một chức năng như tìm tối đa từ một danh sách?


26

Tôi có một đầu vào là một danh sách và đầu ra là tối đa của các thành phần của danh sách đầu vào.

Học máy có thể học một chức năng như vậy luôn luôn chọn tối đa các yếu tố đầu vào có trong đầu vào không?

Đây có vẻ là một câu hỏi khá cơ bản nhưng nó có thể cho tôi hiểu về những gì máy học có thể làm nói chung. Cảm ơn!


1
Tôi nghĩ bạn có thể thử điều này như một vấn đề hàng loạt tức là sử dụng Mạng thần kinh tái phát. Nguồn cấp dữ liệu được sắp xếp vào mạng.
vipin bansal

2
Xem thêm datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; mạng nơ-ron có thể sắp xếp một danh sách đầu vào, vì vậy chắc chắn có thể trích xuất tối đa.
Ben Reiniger

3
@TravisBlack: thực sự, đây chắc chắn là loại chức năng mà bạn không thể học với các mạng thần kinh tiêu chuẩn. Ví dụ, giả sử bạn chỉ cần cắm vào một vectơ có giá trị để dự đoán là lớn hơn bất kỳ giá trị nào bạn có trong tập huấn luyện của mình. Bạn có nghĩ rằng mạng lưới thần kinh được đào tạo sẽ mang lại cho bạn giá trị lớn nhất đó không?
Vách đá AB

10
@TravisBlack NOOO! Các mạng nơ-ron không thể học được về cơ bản bất kỳ chức năng toán học nào. Cardinality-khôn ngoan, hầu hết tất cả các chức năng là bệnh lý hầu như không liên tục ở mọi nơi. Những gì bạn có thể có nghĩa là, rất nhiều chức năng mà các nhà toán học thực sự quan tâm đã xảy ra đủ để hoạt động tốt đến mức các mạng thần kinh có thể ước chừng chúng tốt tùy ý. Nhưng điều đó không giống với khả năng học bất kỳ chức năng nào .
leftaroundabout

6
@leftaroundabout và Cliff: Thật tốt khi thấy ai đó ở lại trên mặt đất trong sự cường điệu ML / DL gần đây. Mọi người đang sử dụng NN và khi bạn đào sâu hơn một cấp, bạn nhận thấy rằng họ thường không có ý tưởng nhỏ nhất về những gì họ thực sự đang làm ở đó - ngoài các thông số điều chỉnh mù quáng từ một số ví dụ "Hello World" cho đến khi họ nhìn thấy một số mẫu. xkcd nhận được điều này chính xác: xkcd.com/1838 . Tôi hy vọng rằng ai đó vẫn có thể thêm một câu trả lời ở đây sâu sắc hơn câu trả lời hiện tại. (Không xúc phạm bất cứ ai, nhưng sự thiếu hiểu biết chung về NN làm phiền tôi ...)
Marco13

Câu trả lời:


35

Có thể , nhưng lưu ý rằng đây là một trong những trường hợp mà máy học không phải là câu trả lời . Có xu hướng thử và học máy shoehorn trong các trường hợp thực sự, các giải pháp dựa trên quy tắc chuẩn không nhanh hơn, đơn giản hơn và nói chung là lựa chọn đúng: P

Chỉ vì bạn có thể, không có nghĩa là bạn nên

Chỉnh sửa : Ban đầu tôi viết điều này là "Có, nhưng lưu ý rằng ..." nhưng sau đó bắt đầu nghi ngờ bản thân mình, chưa bao giờ thấy nó được thực hiện. Tôi đã thử nó chiều nay và chắc chắn là có thể làm được:

import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, Dropout
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from keras.callbacks import EarlyStopping

# Create an input array of 50,000 samples of 20 random numbers each
x = np.random.randint(0, 100, size=(50000, 20))

# And a one-hot encoded target denoting the index of the maximum of the inputs
y = to_categorical(np.argmax(x, axis=1), num_classes=20)

# Split into training and testing datasets
x_train, x_test, y_train, y_test = train_test_split(x, y)

# Build a network, probaly needlessly complicated since it needs a lot of dropout to
# perform even reasonably well.

i = Input(shape=(20, ))
a = Dense(1024, activation='relu')(i)
b = Dense(512, activation='relu')(a)
ba = Dropout(0.3)(b)
c = Dense(256, activation='relu')(ba)
d = Dense(128, activation='relu')(c)
o = Dense(20, activation='softmax')(d)

model = Model(inputs=i, outputs=o)

es = EarlyStopping(monitor='val_loss', patience=3)

model.compile(optimizer='adam', loss='categorical_crossentropy')

model.fit(x_train, y_train, epochs=15, batch_size=8, validation_data=[x_test, y_test], callbacks=[es])

print(np.where(np.argmax(model.predict(x_test), axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())

Đầu ra là 0,74576, do đó, nó tìm đúng tối đa 74,5% thời gian. Tôi không có nghi ngờ rằng điều đó có thể được cải thiện, nhưng như tôi nói đây không phải là một usecase tôi muốn giới thiệu cho ML.

EDIT 2 : Thật ra tôi đã chạy lại sáng nay bằng cách sử dụng RandomForestClassifier của sklearn và nó hoạt động tốt hơn đáng kể:

# instantiation of the arrays is identical

rfc = RandomForestClassifier(n_estimators=1000, verbose=1)
rfc.fit(x_train, y_train)

yhat_proba = rfc.predict_proba(x_test)


# We have some annoying transformations to do because this .predict_proba() call returns the data in a weird format of shape (20, 12500, 2).

for i in range(len(yhat_proba)):
    yhat_proba[i] = yhat_proba[i][:, 1]

pyhat = np.reshape(np.ravel(yhat_proba), (12500,20), order='F')

print(np.where(np.argmax(pyhat, axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())

Và điểm số ở đây là 94,4% số mẫu được xác định chính xác tối đa, điều này thực sự khá tốt.


1
@TravisBlack yeah ban đầu tôi đã bắt đầu nó là "Có, nhưng ..." nhưng sau đó nghi ngờ bản thân và bị thuyết phục. Tôi đã cải thiện câu trả lời ngay bây giờ :).
Dan Scally

16
Khi đào tạo và kiểm tra toàn bộ mọi thứ với các vectơ có chứa các giá trị trong [0,100], thì điểm số là khoảng 0,95. Khỏe. Nhưng khi huấn luyện nó với các giá trị trong [0,100] và kiểm tra nó với các giá trị trong [100,200], điểm thực tế là bằng không . Bạn đã lùi một bước với chỉnh sửa của bạn. Nhưng để làm cho điều này rõ ràng rõ ràng cho những người mù quáng xem ML là vũ khí thần kỳ có thể giải quyết mọi vấn đề: Bất kể bạn đang học gì ở đó: Đó KHÔNG phải là 'chức năng tối đa'! .
Marco13

2
(Một bên: Để thông báo cho người khác về phản hồi cho nhận xét của họ, hãy sử dụng @, như trong @Marco13). Về câu hỏi: Tôi nghĩ rằng câu nói của bạn "học máy không phải là câu trả lời" làm cho nó rõ ràng. Tôi chủ yếu sợ rằng có quá nhiều người không áp dụng sự kiểm tra thích hợp khi sử dụng ML / DL / NN, và đặc biệt, khi họ gặp phải thứ gì đó có vẻ như có thể "giải quyết vấn đề của họ", mà không hiểu tại sao nó lại xuất hiện như vậy và do đó mà không nhận ra khi nào "giải pháp" chỉ là một tạo tác của một quá trình không được hiểu rõ lắm.
Marco13

2
@aroth chắc chắn; tốt nhất đây là một xấp xỉ tối đa () áp dụng cho phạm vi của dữ liệu đào tạo mà nó nhìn thấy. Tôi đã giải quyết vấn đề này, nhưng tôi không có ý định làm mất đi cảm xúc chính trong câu trả lời của mình, đó là không sử dụng ML cho loại vấn đề này .
Dan Scally

1
@BradyGilg Chuẩn hóa dữ liệu đầu vào ... uhhm ... trong khi bạn có thể đúng vì điều này sẽ mang lại kết quả "tốt hơn", kết quả vẫn không có ý nghĩa gì, vì NN không "học chức năng tối đa" . Và tranh luận theo một số cách rõ ràng là một vấn đề rất hàn lâm - tôi thậm chí còn nói "quá hàn lâm": Bạn muốn tính toán / dự đoán mức tối đa của một số vectơ và để tính toán tối đa, trước tiên bạn phải tính toán tối thiểu / max để thực hiện chuẩn hóa (hoặc mean / stdDev cho tiêu chuẩn hóa, điều này dường như cũng không hợp lý lắm).
Marco13

26

Vâng. Rất quan trọng, BẠN quyết định kiến ​​trúc của một giải pháp học máy. Kiến trúc và quy trình đào tạo không tự viết; chúng phải được thiết kế hoặc tạo khuôn mẫu và việc đào tạo theo sau như một phương tiện để khám phá một tham số hóa của kiến ​​trúc phù hợp với một tập hợp các điểm dữ liệu.

Bạn có thể xây dựng một kiến ​​trúc rất đơn giản thực sự bao gồm một hàm tối đa:

net(x) = a * max(x) + b * min(x)

trong đó ab là các tham số đã học.

Được cung cấp đủ các mẫu đào tạo và một thói quen đào tạo hợp lý, kiến ​​trúc rất đơn giản này sẽ học rất nhanh để đặt a thành 1 và b thành 0 cho nhiệm vụ của bạn.

Học máy thường có hình thức giải trí nhiều giả thuyết về kỳ tích hóa và biến đổi các điểm dữ liệu đầu vào, và học cách chỉ bảo tồn các giả thuyết có tương quan với biến mục tiêu. Các giả thuyết được mã hóa rõ ràng trong kiến ​​trúc và các hàm phụ có sẵn trong thuật toán được tham số hóa, hoặc như các giả định được mã hóa trong thuật toán "không tham số".

Ví dụ, sự lựa chọn sử dụng các sản phẩm chấm và phi tuyến tính phổ biến trong mạng lưới thần kinh vanilla ML có phần tùy ý; nó diễn tả giả thuyết bao quát rằng một hàm có thể được xây dựng bằng cách sử dụng cấu trúc mạng cấu thành được xác định trước của các phép biến đổi tuyến tính và các hàm ngưỡng. Các tham số hóa khác nhau của mạng đó thể hiện các giả thuyết khác nhau về việc sử dụng các phép biến đổi tuyến tính nào. Bất kỳ hộp công cụ chức năng nào cũng có thể được sử dụng và công việc của người học máy là khám phá thông qua sự khác biệt hoặc thử nghiệm và lỗi hoặc một số tín hiệu lặp lại khác mà chức năng hoặc tính năng trong mảng của nó giảm thiểu tối đa số liệu lỗi. Trong ví dụ đã nêu ở trên, mạng đã học chỉ đơn giản là giảm đến chính hàm tối đa, trong khi đó mạng không phân biệt có thể thay thế "học" một hàm tối thiểu. Các hàm này có thể được biểu thị hoặc xấp xỉ thông qua các phương tiện khác, như trong hàm hồi quy mạng tuyến tính hoặc thần kinh trong một câu trả lời khác. Tóm lại, nó thực sự phụ thuộc vào chức năng hoặc các mảnh LEGO bạn có trong hộp công cụ kiến ​​trúc ML của bạn.


4
+1 ML không gì khác hơn là các phương trình hồi quy ưa thích và đòi hỏi sự lựa chọn phương trình đúng.
Aidan.plenert.macdonald

4
@ Aidan.plenert.macdonald, tuy nhiên, tác động và sự hấp dẫn của ML là không có một lựa chọn đúng nào về phương trình. Các phương trình đã chọn của bạn cần phải là thành viên của tập hợp các phương trình phù hợp, nhưng hóa ra là đối với một loạt các bài toán có chứa các phương trình tổng quát hơn nhiều so với giải pháp được thiết kế cẩn thận, nhưng có thể đưa ra các tham số giải quyết vấn đề nhanh hơn nhiều so với đưa vào nỗ lực thiết kế bổ sung. Câu hỏi này là một ví dụ tốt về cách hoàn toàn không loại bỏ các cân nhắc thiết kế mô hình.
Sẽ

Đó chưa bao giờ là câu hỏi. OP đã hỏi liệu ML có thể tìm thấy (/ learn / infer) một chức năng như max()(từ dữ liệu được dán nhãn) hay không. Họ không nói " Cho rằng bạn đã có max()một khối xây dựng"
smci

@smci Không có "phổ quát" trước cho các kiến ​​trúc hoặc chức năng học máy. Như đã đề cập trong câu trả lời của tôi, bạn có thể tính gần đúng một hàm tối đa bằng cách sử dụng các hàm tuyến tính xen kẽ xen kẽ với các phi tuyến - nhưng không có quy tắc chung nào nói rằng tất cả ML phải sử dụng bộ biến đổi cụ thể đó trong hộp công cụ của nó. Các mạng thần kinh thường (nhưng không phải luôn luôn) có chức năng tối đa theo ý của chúng thông qua các phi tuyến Max Pooling hoặc ReLU. Số lượng các chức năng tính năng có thể là vô hạn, đó là lý do tại sao tôi nhấn mạnh vai trò của sự lựa chọn và thiên vị có khuynh hướng trong kiến ​​trúc ML.
pygosceles

7

Có - Học máy có thể học để tìm tối đa trong một danh sách các số.

Dưới đây là một ví dụ đơn giản về việc học cách tìm chỉ số tối đa:

import numpy as np
from sklearn.tree import DecisionTreeClassifier

# Create training pairs where the input is a list of numbers and the output is the argmax
training_data = np.random.rand(10_000, 5) # Each list is 5 elements; 10K examples
training_targets = np.argmax(input_data, axis=1)

# Train a descision tree with scikit-learn
clf = DecisionTreeClassifier()
clf.fit(input_data, targets)

# Let's see if the trained model can correctly predict the argmax for new data
test_data = np.random.rand(1, 5)
prediction = clf.predict(test_data)
assert prediction == np.argmax(test_data) # The test passes - The model has learned argmax

Có thực sự học chức năng "tối đa"? Một tập huấn gồm 10.000 danh sách năm yếu tố là một xấp xỉ hợp lý cho không gian đầu vào hoàn chỉnh.
Đánh dấu

2
Tuyên bố miễn trừ trách nhiệm: Tôi không phải là chuyên gia ML / DL. Nhưng tôi khá chắc chắn rằng điều này không có ý nghĩa gì. Ý tôi là: Không có ý nghĩa gì cả. Như tôi thấy, bạn không học chức năng tối đa. Bạn đang học các chỉ số của các yếu tố tối đa của tập huấn luyện. Nếu bạn nhập một vectơ chứa hai số lớn hơn cả hai tập huấn luyện, nó có thể sẽ thất bại. Không đề cập đến trường hợp bạn không có 5D- mà là vector 10D. Ném một số dữ liệu vào thư viện mà người ta không hiểu và thấy một kết quả nhất định KHÔNG (hoàn toàn) có nghĩa là nó "hoạt động".
Marco13

Ý tôi là, nó phụ thuộc vào "nó hoạt động" nghĩa là gì. Một cây quyết định nói riêng sẽ chỉ tạo ra một hàm không đổi từng phần, các mảnh là các hộp hình chữ nhật được căn chỉnh theo trục. Trong ví dụ max, đào tạo trên một hypercube rắn, hàm max thực tế là hằng số piecewise trên một số loại hình tam giác. Cho đủ các ví dụ đào tạo và độ sâu, cây sẽ xấp xỉ các vùng tam giác này với độ chính xác tùy ý. Nhưng, như với nhiều mô hình khác (hầu hết?), Bất kỳ mẫu thử nghiệm nào nằm ngoài phạm vi của mẫu đào tạo đều khá vô vọng.
Ben Reiniger

Điều này không chứng minh bất cứ điều gì. OP đã hỏi "tối đa trong một danh sách các số" . Bạn cho rằng chúng phải nổi trong phạm vi 0..1. Hãy thử nhập 2 (hoặc -1 hoặc 1.5) và nó sẽ thất bại.
smci

4

Thuật toán học tập

Thay vì học một hàm như một phép tính được thực hiện bởi mạng nơ ron chuyển tiếp, có cả một lĩnh vực nghiên cứu liên quan đến việc học thuật toán từ dữ liệu mẫu. Ví dụ, người ta có thể sử dụng một cái gì đó như Máy Turing thần kinh hoặc một số phương pháp khác trong đó việc thực thi thuật toán được kiểm soát bằng cách học máy tại các điểm quyết định của nó. Các thuật toán đồ chơi như tìm tối đa, hoặc sắp xếp danh sách hoặc đảo ngược danh sách hoặc lọc danh sách thường được sử dụng làm ví dụ trong nghiên cứu học thuật toán.


2

Tôi sẽ loại trừ các thiết kế có giáo dục từ câu trả lời của tôi. Không, không thể sử dụng phương pháp tiếp cận máy học (ML) ngoài hộp để thể hiện đầy đủ chức năng tối đa cho các danh sách tùy ý với độ chính xác tùy ý. ML là một phương pháp dựa trên dữ liệu và rõ ràng là bạn sẽ không thể tính gần đúng một hàm tại các khu vực nơi bạn không có bất kỳ điểm dữ liệu nào. Do đó, không gian của các quan sát có thể (là vô hạn) không thể được bao phủ bởi các quan sát hữu hạn.

Các phát biểu của tôi có một nền tảng lý thuyết với Định lý xấp xỉ phổ quát của Cybeko cho các mạng lưới thần kinh. Tôi sẽ trích dẫn định lý từ Wikipedia:

Rn

RnxR

Nếu không gian quan sát của bạn nhỏ gọn thì bạn có thể ước chừng hàm tối đa với một tập dữ liệu hữu hạn. Khi câu trả lời được bình chọn hàng đầu đã làm rõ, bạn không nên phát minh lại bánh xe!


1

Đây là một bản mở rộng về nhận xét của tôi. Đối với lời nói đầu, hoàn toàn @DanScally nói đúng rằng không có lý do gì để sử dụng ML để tìm tối đa danh sách. Nhưng tôi nghĩ rằng "nó có thể cho tôi hiểu về những gì máy học có thể làm nói chung" là lý do đủ tốt để đi sâu vào vấn đề này.

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxi
ii


Cuối cùng, cho câu hỏi tiếp theo: chúng ta có thể đào tạo một NN vào trạng thái này không. @DanScally đã cho chúng tôi bắt đầu; Có lẽ biết kiến ​​trúc lý thuyết có thể giúp chúng ta gian lận vào giải pháp? (Lưu ý rằng nếu chúng ta có thể tìm hiểu / xấp xỉ tập các trọng số cụ thể ở trên, thì mạng thực sự sẽ hoạt động tốt ngoài phạm vi của các mẫu đào tạo.)

Máy tính xách tay trong github / Colab

[1,1]được điểm kiểm tra lên tới 0,961, với số điểm ngoài phạm vi là 0,758. Nhưng, tôi đang ghi điểm với cùng một phương pháp như @DanScally, có vẻ hơi không trung thực: chức năng nhận dạng sẽ ghi điểm hoàn hảo trên số liệu này. Tôi cũng đã in ra một vài hệ số để xem liệu có bất cứ thứ gì gần với sự phù hợp chính xác được mô tả ở trên xuất hiện (không thực sự); và một vài kết quả đầu ra thô, điều đó cho thấy mô hình quá nhút nhát trong việc dự đoán mức tối đa, sai lầm ở phía dự đoán rằng không có đầu vào nào là tối đa. Có lẽ sửa đổi mục tiêu có thể giúp ích, nhưng tại thời điểm này tôi đã bỏ quá nhiều thời gian rồi; nếu có ai quan tâm cải thiện cách tiếp cận, vui lòng chơi (trong Colab nếu bạn thích) và cho tôi biết.


Tôi vẫn chưa quấn đầu quanh tờ giấy (nặng về toán học ... và đáng ngạc nhiên là cũ ...), nhưng mặc dù nó có thể chỉ là "mạng" mơ hồ mang lại sự liên tưởng này trong tâm trí tôi, tôi tự hỏi liệu người ta có thể thiết kế một mạng lưới thần kinh mà về cơ bản là "mô phỏng" một mạng sắp xếp ...
Marco13

@ Marco13, chắc chắn, tôi nghĩ rằng việc sử dụng giấy đó để sản xuất NN làm bộ so sánh sẽ tạo ra một mô phỏng NN của mạng phân loại. Nó sẽ sâu hơn khá nhiều so với giấy, nhưng chiều rộng có thể bị thu hẹp xuống kích thước tuyến tính?
Ben Reiniger

Phải thừa nhận rằng, tôi gần như không tham gia sâu vào NN như tôi cần phải nói điều gì đó sâu sắc. Nhưng những thứ như ~ "bạn có thể mô phỏng mọi thứ bằng hai lớp" nghe hơi giống với kết quả từ thiết kế mạch cấp thấp nơi bạn nói rằng bạn có thể "thực hiện mọi chức năng với hai lớp cổng NAND" hoặc không có gì. Tôi nghĩ rằng một số NN được kiểm tra gần đây chỉ là phiên bản ưa thích của những thứ mà mọi người đã phát hiện ra cách đây 50 năm, nhưng có lẽ đây là một quan niệm sai lầm ...
Marco13

0

Vâng, ngay cả khi học máy đơn giản như bình phương tuyến tính tối thiểu thông thường có thể làm điều này nếu bạn sử dụng một số thông minh được áp dụng.

(Nhưng hầu hết sẽ xem xét điều này quá mức kinh khủng).

(Tôi sẽ giả sử chúng ta muốn tìm max abs của vector đầu vào):

  1. f(x)=1x2
  2. f(r)Cr
  3. S
  4. (ϵI+103StS+Cr)1(103St)
  5. p
    pi=pik|pi|k
  6. Chỉ cần tính sản phẩm vô hướng với vectơ chỉ số và vòng.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.