philvec / sentimentPL

Trained PyTorch models for polish language sentiment prediction based on allegro/herbert and CLARIN-PL datasets
GNU General Public License v3.0
11 stars 1 forks source link

Stała wartość sentymentu, jeśli w tekście występuje wiele cyfr/przecinków #1

Closed Frugile closed 2 years ago

Frugile commented 3 years ago

Cześć, używamy właśnie waszego modelu w projekcie, gdzie badamy sentyment komentarzy na temat spółek akcyjnych. Trafiliśmy na dziwne zachowanie - każdy odpowiednio długi tekst powodował zwracanie wartości -0.00899549014866352.

Po przyjrzeniu się sprawie okazało się, że powoduje to odpowiednio częste powtórzenie się niektórych symboli m.in. cyfr lub przecinka. Akurat w naszym zbiorze, w skrótach informacyjnych, często pojawiają się liczby i przecinki.

Przykład, który działa w Colabie:

!pip3 install sentimentpl

from sentimentpl.models import SentimentPLModel

model = SentimentPLModel(from_pretrained='latest')

print(model('Zysk operacyjny w II kwartale wyniósł').item()) # 0.07128041237592697
print(model('Zysk operacyjny, w II kwartale wyniósł').item()) # 0.003633244661614299
print(model('Zysk operacyjny, w II, kwartale wyniósł').item()) # -0.00899549014866352
print(model('Zysk operacyjny, w II, kwartale, wyniósł').item()) # -0.00899549014866352

print(model('Zysk operacyjny w II kwartale wyniósł 0').item()) # 0.07128041237592697
print(model('Zysk operacyjny w II kwartale wyniósł 00').item()) # -0.00899549014866352
print(model('Zysk operacyjny w II kwartale wyniósł 000').item()) # -0.00899549014866352

ew. realne przykłady w komentarzu

Trudno stwierdzić z czego dokładnie wynika problem, możliwe, że model "overfitował się" do niektórych tokenów.

Prawdopodobnie do naszego projektu przygotujemy własny model, chciałem jednak poinformować was o problemie.

Frugile commented 3 years ago

Realne przykłady:

long_text = 'RN PKO BP powołała do zarządu dwie osoby, nie wybrała prezesa23.2.Warszawa - Rada nadzorcza PKO BP powołała do zarządu banku Roberta Działaka i Stefana Świątkowskiego - poinformował bank w piątkowym komunikacie. Rada nie wybrała jednak prezesa banku.  Działak został powołany z dniem 23 lutego, natomiast Świątkowski - z dniem 1 maja.  W ubiegłym tygodniu rada nadzorcza PKO BP dostała opinie prawne, z których wynikało, że może podejmować decyzje w zmniejszonym składzie. Po rezygnacji z funkcji członka rady nadzorczej przez prof. Jerzego Osiatyńskiego pojawiły się bowiem wątpliwości, czy skład rady nadzorczej jest wystarczający do podejmowania ważnych uchwał.  Minister skarbu Wojciech Jasiński powiedział w środę, że procedura wyboru prezesa PKO BP potrwa jeszcze tydzień lub dwa.  Zarząd PKO BP zwołał na 6 marca nadzwyczajne walne zgromadzenie akcjonariuszy PKO BP, by uzupełnić skład rady nadzorczej.'
long_text_2 = 'Zysk operacyjny w II kwartale wyniósł 38,6 mln zł i był lekko niższy od oczekiwań rynkowych zakładających 41,1 mln zł EBIT.Przychody wyniosły w II kwartale 244,5 mln zł. Analitycy spodziewali się, że przychody wyniosą 244,9 mln zł.Po I półroczu NG2 ma 52,78 mln zł zysku netto, 47,83 mln zł zysku operacyjnego i 440,26 mln zł przychodów. W analogicznym okresie 2009 roku zysk spółki wynosił prawie 35,5 mln zł, EBIT 46,74 mln zł, a przychody 422,14 mln zł.'
print(model(long_text).item()) # -0.00899549014866352
print(model(long_text_2).item()) # -0.00899549014866352
philvec commented 2 years ago

Po zbadaniu problemu okazało się, że dla dłuższych tekstów wewnątrz końcowej sieci regresyjnej bardzo często pojawiają się wartości ujemne, które są przycinane przez funkcję aktywacji ReLU. W efekcie na przykład dla podanych przez @Frugile przykładów, na przedostatniej warstwie liniowej pojawia się wektor zerowy, który z kolei implikuje stałą, bliską zeru wartość sentymentu na wyjściu modelu.

Przyczyną jest najprawdopodobniej fakt, że w zbiorze treningowym znacznie przeważały pojedyncze zdania, krótkie teksty. Prawdopodobnie najlepszym rozwiązaniem byłoby więc powiększenie zbioru treningowego o dłuższe przykłady - na razie jednak zmieniłem ReLU na LeakyReLU i kilkakrotnie przeuczyłem model - problem nie występuje, przynajmniej w przypadkach podobnych do podanych. Warto jednak pamiętać, że issue wskazuje właśnie na większy problem, jakim jest słabe radzenie sobie modelu z dłuższymi zdaniami.


After examining the problem, it turned out that for longer texts, negative values appear very often inside the final regression layer, which are then truncated by the ReLU activation function. As a result, for the examples given by @Frugile, a zero vector appears on the penultimate linear layer, which in turn implies a constant, close to zero value of the sentiment at the model output.

The reason is most likely the fact that single sentences and short texts predominated in the training set. Probably the best solution would be to enrich the training set with longer examples - for now, however, I changed ReLU to LeakyReLU and re-trained the model several times - the problem does not occur, at least in cases similar to those given. It is worth remembering, however, that the issue points to a bigger problem, which is the model's poor handling of longer sentences.